Перечислите папки и файлы с Tree на Eclipse - PullRequest
1 голос
/ 29 октября 2011

Сейчас я разрабатываю пример плагина для Eclipse, чтобы показать все каталоги и файлы с моего компьютера, используя JFace (Tree и TreeView).

Я хочу что-то вроде этого:

----------------------------------
| Element  | Number of Childrens |
----------------------------------
| + usr    | 5                   |
|  + bin   | 4                   |
|     file |                     |
|  + games | 2                   |
----------------------------------

Я создаю плагин View witch 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 ]

1 голос
/ 29 октября 2011

Вам нужно использовать 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();
    }
}
0 голосов
/ 21 апреля 2015

josecampos : Привет! Я просмотрел исходный код на Eclipse Community , но есть некоторые ошибки. Это не ответ на вопрос. Я пишу здесь, так как не могу добавить комментарий к ответу выше

  1. в FolderNode.java

                children.add(new FolderNode(this, childFile));
                children.add(new FileNode(this, childFile.getName()));
    

дает 2 ошибки одного типа:

Метод add (String) в типе List не применим для аргументы (FolderNode)

  1. в TreeContentProvider.java

    return ((ITreeNode)parentElement).getChildren().toArray();
    

выдает ошибку:

Метод toArray () не определен для типа List

  1. в TreeLableProvider

    public Image getColumnImage(Object element, int columnIndex) {
    

    дает

Тип возвращаемого значения несовместим с ITableLabelProvider.getColumnImage (Object, int)

И

 return Integer.toString(((ITreeNode)element).getChildren().size());

т

Метод toString (int) в типе Integer не применим для аргументов (измерение)

  1. Наконец-то в TreeSorter.java

    res = (int) (node1.getChildren().getSize() - node2.getChildren().getSize());
    

дает

Оператор - не определен для типа (ов) аргументов. Java.awt.Dimension, java.awt.Dimension

...