试验代码如下: package demo; import java.util.Vector; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.ITreeViewerListener; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TreeExpansionEvent; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Tree; public class TreeTest { public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(display); Tree tree = new Tree(shell, SWT.BORDER); TreeViewer treeViewer = new TreeViewer(tree); // tree.addMouseListener(new MouseAdapter(){ // @Override // public void mouseDoubleClick(MouseEvent e) { // MessageDialog.openInformation(e.display.getActiveShell(), "DoubleClicked", ((Tree)e.getSource()).getSelection()[0].getText()); // } // }); treeViewer.addTreeListener(new ITreeViewerListener(){ public void treeCollapsed(TreeExpansionEvent e) { MessageDialog.openInformation(((TreeViewer)e.getSource()).getTree().getShell(), "TreeCollapsed", ((Category)e.getElement()).getName()); } public void treeExpanded(TreeExpansionEvent e) { MessageDialog.openInformation(((TreeViewer)e.getSource()).getTree().getShell(), "TreeExpanded", ((Category)e.getElement()).getName()); } }); treeViewer.addDoubleClickListener(new IDoubleClickListener(){ public void doubleClick(DoubleClickEvent e) { MessageDialog.openInformation(((TreeViewer)e.getSource()).getTree().getShell(), "DoubleClicked", ((TreeViewer)e.getSource()).getTree().getSelection()[0].getText()); //JOptionPane.showMessageDialog(null, ((TreeViewer)e.getSource()).getTree().getShell()); } }); treeViewer.setContentProvider(new ITreeContentProvider() { public Object[] getChildren(Object parentElement) { Vector<Category> subcats = ((Category)parentElement).getSubCategories(); return subcats == null ? new Object[0] : subcats.toArray(); } public Object getParent(Object element) { return ((Category)element).getParent(); } public boolean hasChildren(Object element) { return ((Category)element).getSubCategories() != null; } public Object[] getElements(Object inputElement) { if(inputElement != null && inputElement instanceof Vector) { return ((Vector<?>)inputElement).toArray(); } return new Object[0]; } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } }); treeViewer.setLabelProvider(new LabelProvider() { public String getText(Object element) { return ((Category)element).getName(); } }); Vector<Category> categories = new Vector<Category>(); Category category = new Category("Java libraries", null); categories.add(category); category = new Category("UI Toolkits", category); new Category("AWT", category); new Category("Swing", category); new Category("SWT/JFace", category); category = new Category("Java IDEs", null); categories.add(category); new Category("Eclipse", category); new Category("JBuilder", category); treeViewer.setInput(categories); tree.setSize(300, 200); shell.setSize(300, 200); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } static class Category { private String name; private Vector<Category> subCategories; private Category parent; public Category(String name, Category parent) { this.name = name; this.parent = parent; if(parent != null) parent.addSubCategory(this); } public Vector<Category> getSubCategories() { return subCategories; } private void addSubCategory(Category subcategory) { if(subCategories == null) subCategories = new Vector<Category>(); if(!subCategories.contains(subcategory)) subCategories.add(subcategory); } public String getName() { return name; } public Category getParent() { return parent; } } }