Updating ImageIcon in JTree without repainting the Tree?

后端 未结 2 822
感情败类
感情败类 2020-12-02 02:58

Basically I edit an attribute private string status=\"OK\" in the UserObject() of a DefaultTreeNode().

I have a CustomRenderer

相关标签:
2条回答
  • 2020-12-02 03:29

    Use the approach shown in TreeIconDemo2 to condition the renderer based on the model's value. For example,

    private class MyRenderer extends DefaultTreeCellRenderer {
    
        private Icon okIcon;
    
        public MyRenderer(Icon okIcon) {
            this.okIcon = okIcon;
        }
    
        @Override
        public Component getTreeCellRendererComponent(JTree tree, Object value,
            boolean sel, boolean exp, boolean leaf, int row, boolean hasFocus) {
            super.getTreeCellRendererComponent(
                tree, value, sel, exp, leaf, row, hasFocus);
            YourMutableTreeNode node = (YourMutableTreeNode) value;
            if (leaf && node.getStatus().equals("OK")) {
                setIcon(okIcon);
            }
            return this;
        }
    }
    

    Addendum: You can't simply invoke nodeChanged() on a new TreeNode that's not part of the tree; the new node has no parent. If you specify an existing node to nodeChanged(), the notification will happen automatically. If needed, there's an example of searching a tree here.

    0 讨论(0)
  • 2020-12-02 03:30

    When you want the model to be updated, as you do here, you are correct that you want to call nodeChanged. What I think may be wrong is that you are passing in an entirely new node, which obviously doesn't match one found in the tree. Try passing in a reference to the node in the tree you modified - that way the model can find know which node you modified.

    0 讨论(0)
提交回复
热议问题