簡體   English   中英

根據自定義對象狀態更改JTree圖標

[英]Change JTree icons based on custom Object states

我有一個基於幾個自定義類的JTree。 我想給幾個節點一個特定的圖標。 因此,我基於此鏈接執行了以下代碼: 動態更改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。 有什么辦法嗎? 謝謝 :)

全部取決於您的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()添加更多狀態。

您可以訪問該樹中表示的對象:

@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 ;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM