Перечислите папки и файлы с Tree на Eclipse
Сейчас я разрабатываю пример плагина для Eclipse, чтобы показать все каталоги и файлы с моего компьютера, используя JFace (Tree и TreeView).
Я хочу что-то вроде этого:
----------------------------------
| Element | Number of Childrens |
----------------------------------
| + usr | 5 |
| + bin | 4 |
| file | |
| + games | 2 |
----------------------------------
Я создаю плагин View с ViewPart, ContentProvider и TreeLabelProvider.
public class ListFiles extends ViewPart {
/** The ID of the view as specified by the extension. */
public static final String ID = "sortnumbers.views.SortNumbers";
/**
* The constructor.
*/
public ListFiles() { }
/**
* This is a callback that will allow us to create the viewer and initialize it
*/
public void createPartControl(Composite parent) {
Tree tree = new Tree(parent, SWT.MULTI);
tree.setHeaderVisible(true);
tree.setLinesVisible(true);
TreeColumn column0 = new TreeColumn(tree, SWT.NONE);
column0.setText("Element");
column0.setWidth(300);
TreeColumn column1 = new TreeColumn(tree, SWT.NONE);
column1.setText("Number");
column1.setWidth(300);
TreeViewer treeviewer = new TreeViewer(tree);
treeviewer.setContentProvider(new TreeContentProvider());
treeviewer.setLabelProvider(new TreeLabelProvider());
treeviewer.setInput(new FolderNode(new File("/")));
}
@Override
public void setFocus() {
// TODO
}
}
public class TreeContentProvider implements ITreeContentProvider
{
public Object[] getChildren(Object parentElement) {
return ((ITreeNode)parentElement).getChildren().toArray();
}
public Object getParent(Object element) {
return ((ITreeNode)element).getParent();
}
public boolean hasChildren(Object element) {
return ((ITreeNode)element).hasChildren();
}
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
public class TreeLabelProvider extends LabelProvider
{
public String getText(Object element) {
return ((ITreeNode)element).getName();
}
}
Для поиска всех файлов на моем компьютере я создаю интерфейс ITreeNode, TreeNode, FolderNode и FileNode...
public interface ITreeNode
{
public String getName();
public List getChildren();
public boolean hasChildren();
public ITreeNode getParent();
}
public abstract class TreeNode implements ITreeNode
{
protected ITreeNode fParent;
protected List fChildren;
public TreeNode(ITreeNode parent) {
fParent = parent;
}
public boolean hasChildren() {
return true;
}
public ITreeNode getParent() {
return fParent;
}
public List getChildren()
{
if( fChildren != null )
return fChildren;
fChildren = new ArrayList();
createChildren(fChildren);
return fChildren;
}
/* subclasses should override this method and add the child nodes */
protected abstract void createChildren(List children);
}
public class FolderNode extends TreeNode
{
private File fFolder; /* actual data object */
public FolderNode(File folder) {
this(null, folder);
}
public FolderNode(ITreeNode parent, File folder) {
super(parent);
fFolder = folder;
}
public String getName() {
return "FOLDER: " + fFolder.getName();
}
@Override
protected void createChildren(List children)
{
File[] childFiles = fFolder.listFiles();
for(int i=0; i<childFiles.length; i++)
{
File childFile = childFiles[i];
if( childFile.isDirectory() )
children.add(new FolderNode(this, childFile));
else
children.add(new FileNode(this, childFile));
}
}
}
public class FileNode extends TreeNode
{
private File fFile; /* actual data object */
public FileNode(ITreeNode parent, File file)
{
super(parent);
fFile = file;
}
public String getName() {
return "FILE: " + fFile.getName();
}
protected void createChildren(List children) {
}
public boolean hasChildren() {
return false;
}
}
Но результат был:
----------------------------------
| Element | Number of Childrens |
----------------------------------
| + usr | + usr |
| + bin | + bin |
| file | file |
| + games | + games |
----------------------------------
Я не могу понять, почему TreeView заполняют все поля одной и той же строкой... Что мне нужно изменить?
-- Заранее спасибо
Алексей Романов, спасибо...:-)
Теперь мне нужно отсортировать все элементы в TreeView по столбцу (по имени для первого столбца и по размеру для второго столбца). Должен ли я создать класс, расширенный из ViewerComparator или ViewerSorter? И как можно реализовать метод сравнения, чтобы сделать это?
-- Заранее спасибо
2 ответа
Вам нужно использовать ITableLabelProvider
:
public class TreeLabelProvider extends BaseLabelProvider implements ITableLabelProvider
{
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
public String getColumnText(Object element, int columnIndex) {
if (columnIndex == 0)
return ((ITreeNode)element).getName();
else
return ((ITreeNode)element).getChildren().size();
}
}
josecampos: Привет! Я просмотрел исходный код сообщества Eclipse, но есть некоторые ошибки. Это не ответ на вопрос. Я пишу здесь, так как не могу добавить комментарий к ответу выше
в FolderNode.java
children.add(new FolderNode(this, childFile)); children.add(new FileNode(this, childFile.getName()));
дать 2 ошибки одного типа:
Метод add(String) в типе List не применим для аргументов (FolderNode)
в TreeContentProvider.java
return ((ITreeNode)parentElement).getChildren().toArray();
выдает ошибку:
Метод toArray() не определен для типа List
в TreeLableProvider
public Image getColumnImage(Object element, int columnIndex) {
дает
Тип возвращаемого значения несовместим с ITableLabelProvider.getColumnImage(Object, int)
А также
return Integer.toString(((ITreeNode)element).getChildren().size());
дает
Метод toString(int) в типе Integer не применим для аргументов (измерение)
Наконец в TreeSorter.java
res = (int) (node1.getChildren().getSize() - node2.getChildren().getSize());
дает
Оператор - не определен для типа (ов) аргумента. Java.awt.Dimension, java.awt.Dimension