【问题标题】:Change JTree icons based on custom Object states根据自定义对象状态更改 JTree 图标
【发布时间】:2014-10-23 09:58:51
【问题描述】:

我有一个基于几个自定义类的 JTree。我想给几个节点一个特定的图标。因此我根据这个链接做了以下代码:Dynamically change icon of specific nodes in JTree

        DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer() {
        private static final long serialVersionUID = 1L;
        private Icon good = new ImageIcon(getClass().getResource("/good.png"));
        private Icon dunno = new ImageIcon(getClass().getResource("/dunno.png"));
        private Icon bad = new ImageIcon(getClass().getResource("/bad.png"));

        @Override
        public Component getTreeCellRendererComponent(JTree tree,
            Object value, boolean selected, boolean expanded,
            boolean isLeaf, int row, boolean focused) {

            Component c = super.getTreeCellRendererComponent(tree, value, selected, expanded, isLeaf, row, focused);

            // JTreePanelNode node = (JTreePanelNode)c; - not possible
            return c;
        }
    };
    this.getTree().setCellRenderer(renderer);   

我的每个节点都是 JTreePanelNode(自定义类)的一个对象,它保存了一个特定的状态,可以通过 setState(String s) 设置并通过 getState() 获取。所以我想要的是这样的:

if(node.getState().equals("good")) ..
else if(node.getState.equals("bad")) ..
else ..

我怎样才能实现这样的目标?据我了解,渲染器使用 getTreeCellRendererComponent 遍历每个节点并应用我可以使用 setIcon 和几个 ifs() 选择的特定图标。但是我不能转换为 JTreePanelNode。有什么解决办法吗?谢谢:)

【问题讨论】:

  • 为什么不能将value 转换为JTreePanelNode

标签: java swing jtree treecellrenderer


【解决方案1】:

一切都取决于您的 JTreePanelNode 类。如果它实现了 TreeNode 接口,你可以使用:

public Component getTreeCellRendererComponent(JTree tree, Object value,
        boolean sel, boolean expanded, boolean leaf, int row,
        boolean hasFocus) {
    Component comp = super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf,
            row, hasFocus);
    TreeNode current = (TreeNode)value;

    if (leaf) {
        //set leaf icon
    } else if (expanded) {
        //set expanded icon
    } else {
        // set default state
    }

    if (hasFocus)
        //set what it looks like if focused

    else if (selected)
        //set what it looks like if selected

    else
        //set default l&f

    comp.setIcon(whatevericonset in above conditions);

    return comp;
}

当然,您可以根据您的节点 class.getState() 添加更多状态。

【讨论】:

  • 非常感谢。我没有意识到“价值”是我可以回馈给我自己的类的节点表示。
  • np,如果你发布了你的特殊树节点类,我们可以给你一个小的工作示例,这对其他人也有帮助。
  • 好吧,基本上我所做的只是将价值回馈给我的班级。这就是我所需要的。
  • 1+ 在这个 Swing 答案中。
【解决方案2】:

您可以访问该树中表示的对象:

@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean isLeaf, int row, boolean focused) {

    Component c = super.getTreeCellRendererComponent(tree, value, selected, expanded, isLeaf, row, focused);
    DefaultMutableTreeNode node = (DefaultMutableTreeNode ) value;
    Object representedObject = node.getUserObject();

    JLabel superLabel = super.getTreeCellRendererComponent();
    String text = label.getText();

    if(object.isGood() ){ //i don't know your code
        superLabel .setText (text +"goooooooood");
    }else{
        superLabel .setText (text +"badbadbabd");
    }
    return superLabel ;
}

【讨论】:

  • 虽然在技术上是正确的,但这确实假设了一个特定的实现。如果 OP 没有使用 DefaultMutableTreeNode 怎么办?
  • 呵呵呵呵 - 是的,你说得非常对,而且是一个很好的观察者!!我印象很深!!我假设用户在docs.oracle.com/javase/tutorial/uiswing/components/tree.html 上跟踪...但我不能保证!非常善于观察,继续努力 =)
  • 好吧,你可能会走运;)
  • 非常感谢大家。我没有意识到“价值”是我可以回馈给我自己的类的节点表示。
猜你喜欢
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
  • 2021-06-14
  • 2016-05-24
  • 2011-06-06
  • 1970-01-01
  • 2013-02-04
相关资源
最近更新 更多