2013-02-19 5 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

+0

* "Я видел много примеров для изменения значка узлы во время создания экземпляра дерева, но я бы хотел, чтобы динамически изменить значок отдельного узла позже »* Так что добавьте эту способность к рендереру. Я не понимаю, как это особенное. Я удивлен, что ваше исследование не показало примеров «динамического» способа рендеринга ячеек. Должно быть большое количество, например, показывающих, как визуализировать данные по-разному во время выполнения и в зависимости от содержимого. –

ответ

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

+1

+1 для (вполне) базового материала – mKorbel

+0

Также обратите внимание, что значение '((DefaultMutableTreeNode)) .getUserObject()' дает объект, который вы можете применить к исходному элементу, помещенному в дерево. – kmort