【发布时间】:2011-12-17 15:45:38
【问题描述】:
现在我正在为 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 扩展的类吗? 以及如何实现比较方法来做到这一点?
-- 提前致谢
【问题讨论】:
标签: eclipse eclipse-plugin treeview tree jface