Создание TreeTables в Swing
Используя это руководство ( http://www.comp.nus.edu.sg/~cs3283/ftp/Java/swingConnect/tech_topics/tables-trees/tables-trees.html) я пытаюсь создать древовидную таблицу для моего проекта Swing пользовательский интерфейс.
В конструкторе моего класса для таблицы я переопределил рендер так:
public class JTreeTable extends JTable {
public JTreeTable(ITreeTableModel treeTableModel) {
super();
...
setDefaultRenderer(ITreeTableModel.class, tree);
...
}
}
где treeTableModel - моя реализация для
interface ITreeTableModel extends TreeModel
В результате таблица выглядит рядом с тем, что я хочу, но у меня есть пара проблем:
Поле (ID) в моем коде определяется как Object, но на самом деле оно представляет числа (1,2,3 и т. Д.). Как изменить представление поля ID?
Узлы в моей таблице не расширяются. Но
public int getChildCount(Object parent_object_id)
возвращает число> 0
PS Я знаю, что, возможно, недостаточно информации для прямого ответа, но мне нужно, по крайней мере, направление, в котором я могу продолжить свои расследования.
1 ответ
В связи с первым из ваших вопросов вы должны реализовать TreeCellRenderer. Предположение, что вы делаете, будет делать что-то похожее на:
//and override also all the other functions of TreeCellRenderer
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
Component returnValue = null;
if ((value != null) && (value instanceof DefaultMutableTreeNode)) {
Object userObject = ((DefaultMutableTreeNode) value)
.getUserObject();
if (userObject instanceof YourClass) {
YourClass yourElement = (YourClass) userObject;
if(col==0) titleLabel.setText(yourElement.getID());
if(col==1) titleLabel.setText(yourElement.getName());
if(col==2) titleLabel.setText(yourElement.getParentID());
if (selected) {
renderer.setBackground(backgroundSelectionColor);
} else {
renderer.setBackground(backgroundNonSelectionColor);
}
renderer.setEnabled(tree.isEnabled());
returnValue = renderer;
}
}
if (returnValue == null) {
returnValue = defaultRenderer.getTreeCellRendererComponent(tree,
value, selected, expanded, leaf, row, hasFocus);
}
return returnValue;
}
}
В настоящее время с вами происходит то, что ваш Cell Renderer возвращает идентификатор элемента экземпляра Object (например, DictionaryItem@11abb71) вместо получения объекта и вызова функции getID().
Вы можете найти дополнительный пример и информацию о примере TreeCellRenderer.
Относительно вашего второго вопроса смотрите пример на примере TreeModel. Может быть, вы также можете попытаться расширить строку по коду. Если значок "+" меняется на "-", это, вероятно, означает, что getChildCount работает хорошо, но не работает это getChild(int row), который будет возвращать нулевой или недопустимый элемент строки дерева.