2015-05-19 4 views
4

Использование этого руководства (http://www.comp.nus.edu.sg/~cs3283/ftp/Java/swingConnect/tech_topics/tables-trees/tables-trees.html) Я пытаюсь создать таблицу дерева для пользовательского интерфейса Swing моего проекта.Создание TreeTables в Swing

В конструкторе моего класса для таблицы я переопределен рендеринга, как это:

public class JTreeTable extends JTable { 
    public JTreeTable(ITreeTableModel treeTableModel) { 
     super(); 
     ... 
     setDefaultRenderer(ITreeTableModel.class, tree); 
     ... 
    } 

} 

где treeTableModel моя реализация для

interface ITreeTableModel extends TreeModel 

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

enter image description here

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

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

    общественности INT GetChildCount (parent_object_id Object)

возвращает число> 0

P.S. Я знаю, что, возможно, недостаточно информации для прямого ответа, но мне нужно, по крайней мере, направление, в котором я могу продолжить свои исследования.

+1

'JTree' будет использовать метод toString для узла для генерации вывода. Вы можете либо изменить то, что возвращает метод toString, либо использовать «TreeCellRenderer» (желательно) – MadProgrammer

+0

@MadProgrammer. Благодарим вас за консультацию. Он работает для меня (A JTree будет использовать метод toString узла для генерации вывода). Второй способ немного сложный :-) –

+1

не изобретать колесо и не беспокоиться (нелегко без переопределения BasicsTreeXxx, оба Renderer, обе модели, слишком жесткие XxxCellEditor с отличным знанием о) 1. купить Jide, 2 SwingX имеет очень хорошее обходное решение – mKorbel

ответ

0

В связи с первым из ваших вопросов вы должны реализовать 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; 
    } 
} 

Что сейчас происходит с вами в том, что ваш сотовый Renderer возвращает объектную экземпляра элемента ID (DictionaryItem @ 11abb71, например) вместо того, чтобы объект и вызов функция getID().

Вы можете найти дополнительные примеры и информацию о TreeCellRenderer example.

, относящийся к вашему второму вопросу смотрите пример на TreeModel example. Возможно, вы также можете попытаться расширить строку по коду. Если значок «+» меняется на «-», это, вероятно, означает, что getChildCount работает хорошо, но то, что он не работает, - это getChild (int row), который будет возвращать элемент null или unvalid tree row.