2010-08-18 119 views

回答

1

您将需要实现TreeCellRenderer的CustomCellRenderer,并将其附加到JTree。

在你的CustomCellRenderer中,你可以放置按钮和图标。

JTree tree = new JTree(rootVector); 
TreeCellRenderer renderer = new CustomCellRenderer(); 
tree.setCellRenderer(renderer); 

检查这个例子:(上面的代码中引用从这里)

http://www.java2s.com/Code/Java/Swing-JFC/TreeCellRenderer.htm

1

您可以将TreeCellRenderer添加到您的JTree。该渲染器可以在树的每个元素上渲染一个图标。

1

从JTree的Javadoc中:

要使用的JTree显示化合物节点(例如,同时包含一个图形图标和文本节点),子类javax.swing.tree.TreeCellRenderer并使用setCellRenderer通知树使用它。

复合节点是你想要的。你必须实现单一的方法,这将返回一个Composite对象,在你的情况下,一个包含一个按钮和一个标签并排的小面板。

4

钳,

您是否有这样的成功?我想要做同样的事情,并且很难让JButton响应用户。设置渲染器让按钮显示顺利,但所有鼠标事件都由JTree自己处理,而不是传递给我的按钮。

我终于找到了解决办法,我想我会在这里发布为他人评论(也许还有更好的办法吗?)

除了我的自定义渲染,我还创建了一个扩展DefaultTreeCellEditor中自定义编辑器。我的自定义渲染器通过构造函数传递到自定义编辑器中。在编辑器中,我重写isCellEditable以返回true,并重写getTreeCellEditorComponent以返回renderer.getTreeCellRendererComponent。这是关键。它返回渲染器组件,这样所有的点击都会被传递到我的自定义渲染器中的面板中,然后我的JButton会正常响应动作事件。

这里是我的编辑:

public class MyTreeCellEditor extends DefaultTreeCellEditor { 

public MyTreeCellEditor(JTree tree, DefaultTreeCellRenderer renderer) { 
    super(tree, renderer); 
} 

public Component getTreeCellEditorComponent(JTree tree, Object value, 
     boolean isSelected, boolean expanded, boolean leaf, int row) { 
    return renderer.getTreeCellRendererComponent(tree, value, true, expanded, leaf, row, true); 
} 

public boolean isCellEditable(EventObject anEvent) { 
    return true; // Or make this conditional depending on the node 
} 

}

在你的树,一定要设置您的自定义编辑器:

myTree.setCellEditor(new MyTreeCellEditor(myTree, (DefaultTreeCellRenderer) myTree.getCellRenderer())); 
+0

+1。 1.5年过去了,这对我们有很大的帮助。谢谢。 – sqram 2012-02-26 20:08:42

+0

+1。我只使用了TreeCellEditor接口,因为DefaultTreeCellEditor有很多不必要的功能。 – Nulano 2015-08-24 09:29:56

相关问题