【问题标题】:Set Imageicon for JTree node为 JTree 节点设置 Imageicon
【发布时间】:2012-11-27 04:53:41
【问题描述】:

我创建了一个JTree。我需要更改特定节点的图标。能够setIcon 用于关闭和打开以及叶节点,但我需要在我的JTree 中为指定节点设置图标。请对此有所了解。

【问题讨论】:

  • 那么你如何设置关闭和打开的图标?
  • tree=new JTree(root); DefaultTreeCellRenderer 渲染器 = (DefaultTreeCellRenderer)tree.getCellRenderer(); renderer.setClosedIcon(new ImageIcon("images/Video-icon.png")); renderer.setOpenIcon(new ImageIcon("images/Video-icon.png")); renderer.setLeafIcon(new ImageIcon("images/close.png"));

标签: java swing jtree


【解决方案1】:

如果您知道如何更改默认图标,您就会知道这发生在 TreeCellRenderer 中。 您可以简单地实现自己的 TreeCellRenderer,它比 DefaultTreeCellRenderer 具有更高级的图标确定功能。

类似这样的:

public class MyTreeCellRenderer implements TreeCellRenderer {

    private final DefaultTreeCellRenderer defaultRenderer = new DefaultTreeCellRenderer();
    private final  Icon specialIcon;

    public MyTreeCellRenderer(Icon specialIcon) {
        this.specialIcon = specialIcon;
    }

    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
        defaultRenderer.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
        if (needsSpecialIcon(tree, value, selected, expanded, leaf, row, hasFocus)) {
            defaultRenderer.setIcon(specialIcon);
        }
        return defaultRenderer;
    }

    private boolean needsSpecialIcon(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
        // check condition for special icon here
        return false;
    }
}

这基本上将默认行为委托给 DefaultTreeCellRenderer,但如果您的特殊条件为真,则会覆盖图标。

【讨论】:

  • DefaultTreeCellRenderer 扩展了 JLabel。在 getTreeCellRendererComponent() 中,它将自己格式化为在树中的位置上绘制(因此它设置了文本和图标)。然后返回自身。我的示例仅使用 DefaultTreeCellRenderer 的所有行为,但如果特殊条件为真,它会使用每个 JLabel 具有的 setIcon() 覆盖图标。
猜你喜欢
  • 2021-07-14
  • 1970-01-01
  • 2014-01-08
  • 2013-01-11
  • 1970-01-01
  • 2015-07-23
  • 2012-03-14
  • 2012-02-08
  • 1970-01-01
相关资源
最近更新 更多