Java Swing: добавить пользовательскую графическую кнопку к элементу JTree
Я хотел бы добавить дополнительную кнопку с маленьким значком справа от элемента в JTree. это можно сделать? если да, то как?
Спасибо!
4 ответа
Вам потребуется CustomCellRenderer, который реализует TreeCellRenderer, и присоедините его к JTree.
В вашем CustomCellRenderer вы можете поместить кнопку и значок.
JTree tree = new JTree(rootVector);
TreeCellRenderer renderer = new CustomCellRenderer();
tree.setCellRenderer(renderer);
Проверьте этот пример: (ссылка выше код здесь)
http://www.java2s.com/Code/Java/Swing-JFC/TreeCellRenderer.htm
Зажим,
У вас был успех с этим? Я хотел сделать то же самое, и мне было трудно заставить JButton ответить пользователю. Настройка средства визуализации для отображения кнопки прошла гладко, но все события мыши обрабатывались самим JTree и не передавались моей кнопке.
Я наконец нашел решение и решил опубликовать его здесь, чтобы другие могли прокомментировать (может быть, есть лучший способ?)
В дополнение к моему пользовательскому средству визуализации я также создал пользовательский редактор, который расширяет DefaultTreeCellEditor. Мой пользовательский рендерер передается в пользовательский редактор через конструктор. В редакторе я переопределяю isCellEditable, чтобы вернуть true, и я переопределяю getTreeCellEditorComponent, чтобы вернуть renderer.getTreeCellRendererComponent. Это был ключ. Он возвращает компонент рендерера, поэтому все клики передаются на мою панель в моем пользовательском рендерере, и мой JButton затем нормально реагирует на события действия.
Вот мой редактор:
public class MyTreeCellEditor extends DefaultTreeCellEditor {
public MyTreeCellEditor(JTree tree, DefaultTreeCellRenderer renderer) {
super(tree, renderer);
}
public Component getTreeCellEditorComponent(JTree tree, Object value,
boolean isSelected, boolean expanded, boolean leaf, int row) {
return renderer.getTreeCellRendererComponent(tree, value, true, expanded, leaf, row, true);
}
public boolean isCellEditable(EventObject anEvent) {
return true; // Or make this conditional depending on the node
}
}
На вашем дереве не забудьте установить свой собственный редактор:
myTree.setCellEditor(new MyTreeCellEditor(myTree, (DefaultTreeCellRenderer) myTree.getCellRenderer()));
Вы можете добавить TreeCellRenderer к вашему JTree. Этот рендерер может отображать иконку на каждом элементе дерева.
От JTree Javadoc:
Чтобы использовать JTree для отображения составных узлов (например, узлов, содержащих как графический значок, так и текст), подкласс
javax.swing.tree.TreeCellRenderer
и использоватьsetCellRenderer
сказать дереву, чтобы использовать его.
Составной узел - это то, что вы хотите. Вы должны реализовать один метод, который будет возвращать Composite
объект, который в вашем случае представляет собой небольшую панель, содержащую кнопку и метку рядом.