当前位置: 首页 > 知识库问答 >
问题:

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

晏华奥
2023-03-14

我想为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;
}

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

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

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

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都会运行,我不想这样。

共有2个答案

金宣
2023-03-14

你可以用更短的方式使用它。“树”是我的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);    
周浩博
2023-03-14

您可以更改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;
}

还要阅读渲染机制。

 类似资料:
  • 问题内容: 我想为JTree中的每个节点设置一个不同的图标,实际上是从数据库中加载每个节点,并带有“ while”,我将每个图标设置为根,叶或父级。像这样: 我所有的声明都是全球性的: 这是我设置节点的代码: 方法makeNode是这样的: 在用节点填充treemodel之后,将模型设置为JTree: 但是问题是。当我尝试设置图标时。我创建一个名为myTreeRenderer的子类,并使用以下代码

  • 我有一个JTree,它的节点由DefaultMutableTreeNode驱动。每个节点都可以验证或不验证。首先,所有节点的图标都是相同的,但当我选择它们并按下verify按钮时,我将更改已验证节点的图标。我希望能够在每个节点上单击和写入,这样就不能使用JLabel显示图标。我编写了以下代码,但它返回NULLException。 数百万,谢谢。

  • 问题内容: 我在创建JTree时遇到困难,该JTree允许通过将节点拖放到JTree中进行重组。看来应该比较简单。我在网上看过示例,但似乎无法在自己的代码中实现它。 例如,sun提供的这种功能允许在不同组件之间拖动到树中,但不能从树本身内部拖动。 而且我也发现了这一点,它允许您将文本拖到JTree中,但不能拖到树中。 任何参考或建议将是巨大的。谢谢 问题答案: 之前没有做过,但是谷歌快速搜索在这里

  • 有没有办法为一个TreeView设置两个根节点? 我发现很多例子,如果简单的树视图,但没有有用的例子,我的情况下。

  • 我知道如何在JTree中设置自定义叶图标 但我无法根据组节点名称设置自定义打开/关闭图标,例如,节点可以称为电子邮件(因此有信封图标很好),或者一个组可以称为任务等等。 我试图通过重写类DefaultTreeCellRenderer的getTreeCellRendererComponent方法来实现这一点 但是更改当前节点的图标只会影响下一个节点! 如何为单个组设置自定义打开/关闭图标? 请看看我

  • 问题内容: 我的Jenkins管道看起来像这样(请原谅一些小的语法错误): 我的意图是与拥有一个节点,与拥有一个节点。 我实际上看到的是,命令运行时在两个节点上都设置了。 根据本教程,“ [特殊变量]的属性是当前节点上的环境变量。” 因此,我希望这能奏效。 问题答案: 在本教程的后面,它说: 在这种情况下,请勿使用env: 因为环境变量的覆盖仅限于对管道运行是全局的,而不是当前线程(以及代理)的局