2013-02-19 124 views
3

我在樹實例化過程中看到了很多用於更改節點圖標的示例,但我想稍後動態更改單個節點的圖標。所以,在我主要的代碼我我的自定義渲染添加到我的樹:動態更改JTree中特定節點的圖標

// Icon I want to set nodes to later 
ImageIcon checkIcon = new ImageIcon("check.jpg"); 

// Creates tree with my nodes 
JTree tree = new JTree(nodes.top); 

// Create custom renderer 
Scenario1Renderer renderer = new Scenario1Renderer(); 

// Set to single tree selection 
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); 

// Set tree to my custom renderer 
//renderer.setRendererIcon(greenIcon); 
tree.setCellRenderer(renderer); 

我在渲染代碼

public class Scenario1Renderer extends DefaultTreeCellRenderer { 

ImageIcon rendererIcon; 

    public void setRendererIcon(ImageIcon myIcon){ 
     this.rendererIcon = myIcon; 
    }; 

public Component getTreeCellRendererComponent( 
     JTree tree, 
     Object value, 
     boolean sel, 
     boolean expanded, 
     boolean leaf, 
     int row, 
     boolean hasFocus) 
{ 

    Component ret = super.getTreeCellRendererComponent(tree, value, 
      selected, expanded, leaf, row, hasFocus); 
      //setIcon(rendererIcon) ; 
      return ret; 
    } 

所以,很明顯,如果我把我的rendererIcon,它會畫我所有的樹實例化期間帶有圖標的節點。我反而希望某種方法可以在執行我的程序時稍後設置單個節點的圖標。

+0

那裏,我看不出有什麼區別,不明白,什麼原因 – mKorbel 2013-02-19 22:18:03

+0

*「我見過很多例子改變的圖標節點樹實例化過程中,但我想要一種方法來動態更改單個節點的圖標以後「*所以添加到渲染器的能力。我不明白這是如何特別的。我很驚訝你的研究沒有顯示出「動態」渲染細胞的例子。應該有大量的例子展示如何在運行時以不同的方式呈現數據,並且取決於內容。 – 2013-02-20 01:09:33

回答

7

您可以根據不同的條件設置不同的圖標。下面是一個簡單的例子,改變選定節點的圖標:

import java.awt.Component; 
import javax.swing.Icon; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTree; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.DefaultTreeCellRenderer; 
import javax.swing.tree.DefaultTreeModel; 

public class TestTree { 
    private static void createAndShowUI() { 
     JFrame frame = new JFrame(); 
     final JTree tree = new JTree(buildDemoModel()); 

     tree.setCellRenderer(new DefaultTreeCellRenderer() { 
      private Icon loadIcon = UIManager.getIcon("OptionPane.errorIcon"); 
      private Icon saveIcon = UIManager.getIcon("OptionPane.informationIcon"); 
      @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); 
       if (selected) 
        setIcon(loadIcon); 
       else 
        setIcon(saveIcon); 
       return c; 
      } 
     }); 
     tree.setVisibleRowCount(10); 
     frame.add(new JScrollPane(tree)); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationByPlatform(true); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private static DefaultTreeModel buildDemoModel() { 
     DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root"); 

     root.add(new DefaultMutableTreeNode("A")); 
     root.add(new DefaultMutableTreeNode("B")); 
     root.add(new DefaultMutableTreeNode("C")); 

     return new DefaultTreeModel(root); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 
+4

作爲參考,顯示了一個類似的方法[這裏](http://stackoverflow.com/a/14097270/230513)。 – trashgod 2013-02-20 02:20:22

+1

+1(相當)基本東西 – mKorbel 2013-02-20 07:43:07

+0

另請注意,'((DefaultMutableTreeNode)value).getUserObject()'產生一個Object,您可以將其轉換爲您放入樹中的原始項目。 – kmort 2016-03-11 16:03:09