为Jtree中的每个节点设置图标

Posted

技术标签:

【中文标题】为Jtree中的每个节点设置图标【英文标题】:Set icon to each node in Jtree 【发布时间】:2014-01-08 15:02:12 【问题描述】:

我想为我的 JTree 中的每个节点设置一个不同的图标,实际上我正在从数据库中加载每个节点,并带有一个“while”,我将每个图标设置为根、叶或父级。像这样:

我所有的声明都是全局的:

private ResultSet myResultSet;
protected DefaultTreeModel treeModel;
private DefaultMutableTreeNode rootNode,childNode,parent1,parent2;

这是我设置节点的代码:

myResultSet=rtnNodes(); /*Method that returns a RS with my nodes*/
while(myResultSet.next())
  switch(myResultSet.getInt(1))  /*The first column is the type of node: root, parent, leaf...*/
    case 0: treeModel = new DefaultTreeModel((rootNode=new DefaultMutableTreeNode(myResultSet.getString(2)))); break;  /*root node*/
    case 1: case 4: parent1 = parent2 = makeNode(rootNode); break;  /*parent node*/
    case 2: makeNode(parent2); break;  /*leaf node*/
    case 3: parent2 = makeNode(parent1); break;  /*sub patern node*/
   /*makeNode is the method where I create the nodes*/

方法makeNode是这样的:

public DefaultMutableTreeNode makeNode(DefaultMutableTreeNode parent)
  //The second column in the RS is the name of the node
  treeModel.insertNodeInto((childNode=new DefaultMutableTreeNode(myResultSet.getString(2))),parent,parent.getChildCount());
  return childNode;

用我的节点填充树模型后,我将模型设置为我的 JTree:

myJTree.setModel(treeModel);
myJTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);

但问题是。当我尝试设置图标时。我创建了一个名为 myTreeRenderer 的子类,并使用它:

myJTree.setCellRenderer(new treeRenderer());

但它并没有按照我的意愿设置图标,子类是:

private ImageIcon root,parent,leaf;

public myTreeRenderer() 
   root=setIcons(2);  /*setIcons is a method that I dont publish in this post, that helps me to set the path of the icons*/
   parent=setIcons(3);
   leaf=setIcons(4);


@Override
public Component getTreeCellRendererComponent(JTree tree,Object value,boolean selected,boolean expanded,boolean leaf,int row,boolean hasFocus)               
   super.getTreeCellRendererComponent(tree,value,selected,expanded,leaf,row,hasFocus);
   DefaultMutableTreeNode nodo = (DefaultMutableTreeNode)value;
   TreeNode t = nodo.getParent();
   if(t!=null)
      setIcon(root);
   
   return this;

如何在不使用他的名字的情况下为每个节点设置图标?子类的代码,按原样,将所有节点设置为相同的图标,每次我在 jtree 中选择一个节点时,getTreeCellRendererComponent 都会运行,我不想要这个。

【问题讨论】:

【参考方案1】:

您可以更改 JTree 节点图标的默认 UI 值,而无需任何自定义渲染器:

URL resource = logaff.class.getResource(IMAGE);
Icon icon = new ImageIcon(resource);

UIManager.put("Tree.closedIcon", icon);
UIManager.put("Tree.openIcon", icon);
UIManager.put("Tree.leafIcon", icon);

或使用类似下一个:

@Override
public Component getTreeCellRendererComponent(JTree tree,
    Object value, boolean selected, boolean expanded,
    boolean leaf, int row, boolean hasFocus) 
        super.getTreeCellRendererComponent(tree, value, selected,expanded, leaf, row, hasFocus);
        DefaultMutableTreeNode nodo = (DefaultMutableTreeNode) value;
        if (tree.getModel().getRoot().equals(nodo)) 
            setIcon(root);
         else if (nodo.getChildCount() > 0) 
            setIcon(parent);
         else 
            setIcon(leaf);
        
        return this;

还可以阅读rendering mechanism。

【讨论】:

哇!我有两个星期的时间来寻找这样的答案,我和一个朋友读了很多书,而这段时间我们都很困惑。为了简单查看代码是否完美,我将对其进行测试,稍后将告诉您它是如何工作的。非常感谢您的帮助!!! 很好的解决方案!图标大小是 16x16 px² 还是什么?【参考方案2】:

您可以使用它,更短的方式。 “树”是我的 JTree 组件。

DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) tree.getCellRenderer();
Icon closedIcon = new ImageIcon("closed.png");
Icon openIcon = new ImageIcon("open.png");
Icon leafIcon = new ImageIcon("leaf.png");
renderer.setClosedIcon(closedIcon);
renderer.setOpenIcon(openIcon);
renderer.setLeafIcon(leafIcon);    

【讨论】:

以上是关于为Jtree中的每个节点设置图标的主要内容,如果未能解决你的问题,请参考以下文章

根据深度级别更改 JTree 节点图标

Java程序,JTree获取节点ID

设置新 TreeModel 时如何自动扩展 JTree?

Java:如何以编程方式选择和扩展 JTree 中的多个节点?

如何将复选框添加到 JTree 节点以管理多选?

C# winform treeview 节点展开状态的图标设置