【问题标题】:java swing: add custom graphical button to JTree itemjava swing:将自定义图形按钮添加到 JTree 项
【发布时间】:2011-03-31 10:18:18
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: java swing jtree


    【解决方案1】:

    夹,

    你成功了吗?我想做同样的事情,但很难让 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()));
    

    【讨论】:

    • +1。我只使用了 TreeCellEditor 接口,因为 DefaultTreeCellEditor 有很多不必要的功能。
    • 渲染器只负责渲染它的样子。当您单击一个组件时,您正在对其进行编辑,因此责任被传递给了编辑器。例如,JTable 就是这样工作的。如果您想要 JTable 中的可点击按钮,那么编辑器是实际处理按钮点击的工具,而不是渲染器。也就是说,这就是为什么我不喜欢你的回答。你需要分开责任。你不应该调用你的渲染器来获得一些功能性的东西。渲染器和编辑器需要不同的组件才能更符合 Swing 框架。
    • (顺便说一句,你应该分开编辑器和渲染器是有重要原因的。它并不像听起来那么随意。)Swing 是一个很好的框架,可以从你那里抽象出很多东西,作为一个开发人员,因此您键入的内容更少。您仍然有责任了解您调用的 API 以获得有效的逻辑。这通常是 Swing 名声不佳的原因,因为人们只是假设 API 是如此抽象,以至于他们不必考虑自己在做什么,这是一种非常糟糕的代码开发方式。
    【解决方案2】:

    您将需要实现 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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        来自 JTree Javadoc:

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

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

        【讨论】:

          猜你喜欢
          • 2020-07-05
          • 1970-01-01
          • 2014-07-29
          • 1970-01-01
          • 1970-01-01
          • 2018-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多