java swing:将自定义图形按钮添加到JTree项

java swing:将自定义图形按钮添加到JTree项,java,swing,jtree,Java,Swing,Jtree,我想在JTree中的项目右侧添加一个带有小图标的附加按钮。 这能做到吗?如果是,怎么做 谢谢 您可以将TreeCellRenderer添加到JTree。此渲染器可以在树的每个元素上渲染一个图标。来自JTree Javadoc: 要使用JTree显示复合节点(例如,同时包含图形图标和文本的节点),请子类javax.swing.tree.TreeCellRenderer并使用setCellRenderer通知树使用它 复合节点就是您想要的。您必须在单个方法上实现,该方法将返回一个组合对象,在您的情况

我想在JTree中的项目右侧添加一个带有小图标的附加按钮。 这能做到吗?如果是,怎么做


谢谢

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

来自JTree Javadoc:

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


复合节点就是您想要的。您必须在单个方法上实现,该方法将返回一个组合对象,在您的情况下,该对象位于一个小面板中,其中并排包含一个按钮和一个标签。

您需要自定义实现TreeCellRenderer的CellRenderer,并将其附加到JTree

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

JTree tree = new JTree(rootVector);
TreeCellRenderer renderer = new CustomCellRenderer();
tree.setCellRenderer(renderer);
检查此示例:(此处引用了上面的代码)

夹具

你成功了吗?我也想做同样的事情,但很难让JButton响应用户。设置渲染器以使按钮顺利显示,但所有鼠标事件都由JTree本身处理,而不是传递给我的按钮

我终于找到了一个解决方案,我想我会把它贴在这里让其他人评论(也许有更好的方法?)

除了自定义渲染器之外,我还创建了一个扩展DefaultTreeCeleditor的自定义编辑器。我的自定义渲染器通过构造函数传递到自定义编辑器。在编辑器中,我重写isCellEditable以返回true,重写getTreeCellEditorComponent以返回renderer.GetTreeCellrenderComponent。这是关键。它返回渲染器组件,因此所有单击都会传递到自定义渲染器中的“我的面板”,然后我的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()));

+1.我只使用了TreeCellEditor接口,因为DefaultTreeCellEditor有很多不必要的功能。渲染器只负责渲染它的外观。当你点击一个组件时,你正在编辑它,所以责任就转移到了编辑器身上。例如,JTable函数就是这样。如果您希望在JTable中有一个可单击的按钮,那么实际处理按钮单击的是编辑器,而不是渲染器。也就是说,这就是为什么我不喜欢你的答案。你需要把责任分开。您不应该调用渲染器来获得一些功能性的操作。渲染器和编辑器需要不同的组件才能更符合Swing框架。(顺便说一句,这里有一些重要的原因说明为什么应该将编辑器和渲染器分开。这并不像听起来那么武断。)Swing是一个很好的框架,可以从开发人员那里抽象出很多东西,因此您可以少键入。您仍然有责任理解您正在调用的API以获得有效的逻辑。这就是Swing名声不好的典型原因,因为人们只是认为,因为API是如此抽象,他们不必考虑自己在做什么,这是一种非常糟糕的代码开发方式。