【问题标题】:List folders and files with Tree on Eclipse在 Eclipse 上使用 Tree 列出文件夹和文件
【发布时间】:2011-12-17 15:45:38
【问题描述】:

现在我正在为 Eclipse 开发一个示例插件,以使用 JFace(Tree 和 TreeView)显示我计算机中的所有目录和文件。

我想要这样的东西:

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

我创建插件 View 女巫 ViewPartContentProviderTreeLabelProvider

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();
    }
}

为了搜索我计算机中的所有文件,我创建了界面 ITreeNodeTreeNodeFolderNodeFileNode ...

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 扩展的类吗? 以及如何实现比较方法来做到这一点?

-- 提前致谢

【问题讨论】:

    标签: eclipse eclipse-plugin treeview tree jface


    【解决方案1】:

    josecampos:您好,我已经查看了Eclipse Community 的源代码,但有一些错误。这不是问题的答案。我在这里发帖,因为我无法对上面的答案添加评论

    1. 在 FolderNode.java 中

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

    给出2个相同类型的错误:

    List 类型中的 add(String) 方法不适用于 参数(文件夹节点)

    1. 在 TreeContentProvider.java 中

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

    报错:

    未定义 List 类型的 toArray() 方法

    1. 在 TreeLableProvider 中

      public Image getColumnImage(Object element, int columnIndex) {
      

      给予

    返回类型与ITableLabelProvider.getColumnImage(Object, int)不兼容

    还有

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

    给了

    Integer 类型中的 toString(int) 方法不适用于参数 (Dimension)

    1. 终于在 TreeSorter.java 中

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

    给予

    操作符 - 对于参数类型 java.awt.Dimension、java.awt.Dimension 未定义

    【讨论】:

      【解决方案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();
          }
      }
      

      【讨论】:

      • Alexey Romanov,谢谢... :) 在此之后,我在排序树时遇到了问题,但几个小时后,我可以理解并找到解决问题的方法...您可以在Eclipse Community获得这个问题的源代码...干杯,;)
      猜你喜欢
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      • 2011-01-05
      • 1970-01-01
      • 2016-05-06
      • 1970-01-01
      相关资源
      最近更新 更多