Установите значок для каждого узла в Jtree

Я хочу установить для каждого узла в моем JTree другой значок, на самом деле я загружаю каждый узел из базы данных с помощью «пока», я устанавливаю каждый значок как корень, лист или родитель. Нравится:

Все мои объявления являются глобальными:

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, я этого не хочу.


person Vlad    schedule 19.12.2013    source источник


Ответы (2)


Вы можете изменить значения пользовательского интерфейса по умолчанию для значков узлов JTree без какого-либо специального средства визуализации:

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;
}

Также прочитайте о механизме рендеринга.

person alex2410    schedule 19.12.2013
comment
ВАУ! Я две недели искал такой ответ, мы с другом много читали и все это время были в замешательстве. Для простого просмотра код идеален, я его протестирую и позже расскажу как он работает. Спасибо большое за вашу помощь!!! - person Vlad; 20.12.2013

Вы можете использовать его, более короткий путь. "дерево" - это мой компонент 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);    
person mesutpiskin    schedule 14.02.2017