Установить значок для каждого узла в Jtree
Я хочу установить для каждого узла в моем 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, я этого не хочу.
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;
}
Также читайте о механизме рендеринга.
Вы можете использовать это, более короткий путь. "дерево" - это мой компонент 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);