Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为Jtree中的每个节点设置图标_Java_Swing_Jtree_Treenode_Treecellrenderer - Fatal编程技术网

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

Java 为Jtree中的每个节点设置图标,java,swing,jtree,treenode,treecellrenderer,Java,Swing,Jtree,Treenode,Treecellrenderer,我想为JTree中的每个节点设置一个不同的图标,实际上我是从数据库中加载每个节点,用一个“while”,我将每个图标设置为根、叶或父。像这样: 我所有的声明都是全球性的: private ResultSet myResultSet; protected DefaultTreeModel treeModel; private DefaultMutableTreeNode rootNode,childNode,parent1,parent2; 这是我设置节点的代码: myResultSet=rtn

我想为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);
但问题是。当我尝试设置图标时。我创建了一个名为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中选择一个节点时,GetTreeCellRenderer组件都会运行,我不希望出现这种情况。

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

另外,请阅读。

您可以用一种较短的方式使用它。“tree”是我的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);    

哇!我有两周的时间来寻找这样的答案,我和一个朋友读了很多书,这段时间我们都很困惑。为了简单地查看代码是否完美,我将对其进行测试,稍后将告诉您它是如何工作的。非常感谢你的帮助!!!