Создание 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

В результате таблица выглядит рядом с тем, что я хочу, но у меня есть пара проблем:

введите описание изображения здесь

  1. Поле (ID) в моем коде определяется как Object, но на самом деле оно представляет числа (1,2,3 и т. Д.). Как изменить представление поля ID?

  2. Узлы в моей таблице не расширяются. Но

    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), который будет возвращать нулевой или недопустимый элемент строки дерева.

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