Java swing: добавить пользовательскую графическую кнопку в элемент JTree

91
10

Я хотел бы добавить дополнительную кнопку с маленьким значком справа от элемента в JTree.
это можно сделать? если да, то как?


спасибо!

спросил(а) 2010-08-18T11:32:00+04:00 10 лет, 2 месяца назад
1
Решение
57

Вам понадобится 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

ответил(а) 2010-08-18T11:57:00+04:00 10 лет, 2 месяца назад
91

Зажим,


У вас был успех? Я хотел сделать то же самое и мне нелегко было заставить 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()));

ответил(а) 2010-09-22T15:24:00+04:00 10 лет, 1 месяц назад
59

Из JTree Javadoc:


Чтобы использовать JTree для отображения составных узлов (например, узлов, содержащих как графический значок, так и текст), подкласс javax.swing.tree.TreeCellRenderer и использовать setCellRenderer, чтобы сообщить дереву использовать его.



Соединение node - это то, что вы хотите. Вы должны реализовать один метод, который вернет объект Composite, который находится в вашем случае с небольшой панелью, содержащей кнопку и метку рядом.

ответил(а) 2010-08-18T11:55:00+04:00 10 лет, 2 месяца назад
59

Вы можете добавить TreeCellRenderer в свой JTree. Этот рендерер может отображать значок на каждом элементе дерева.

ответил(а) 2010-08-18T11:52:00+04:00 10 лет, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема