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 объект, который в вашем случае представляет собой небольшую панель, содержащую кнопку и метку рядом.

Другие вопросы по тегам