Использование TreeTable с различными типами корней и узлов - PullRequest
3 голосов
/ 14 апреля 2011

У меня следующая проблема:

Я хочу иметь компонент таблицы в стиле JTeeTable, за исключением того, что корни (классы ниже) и узлы дерева не одного типа.

Например, предположим, что у меня есть следующие классы:

public final class Entry {

    private int id;
    private String title;
    private String notes;

    private List<SubEntry> subEntryList; /** @see SubEntry*/
}


public final class SubEntry{
    private int id;
    private String title;
    private String notes;

}

Хотя эти два класса выглядят одинаково и могут мотивировать случай наследования, они НЕ связаны таким образом . Думайте об этом как о машине со списком автомобильных запчастей ИЛИ о фильме со списком актеров.

В течение двух недель я пытался придумать способ визуально представить вышеизложенное. Я думал об использовании компонента JTreeTable, но все примеры, которые я привел, являются перекрестным использованием, когда подстатьи (узлы ??) имеют тот же тип, что и записи (лист ??).

Моя идея пока: Видя, что если я использую таблицу, столбцы будут иметь одинаковые имена, я подумал, что должен использовать таблицу и другую таблицу в качестве TableCellRenderer, а затем поддерживать показ / скрытие при двойном щелчке родительской строки.

Хотя я не уверен, как двигаться вперед ...

Итак, если у вас есть идеи, как мне поступить, пожалуйста, поделитесь своими идеями.

UPDATE

//I finally managed to sort out the tree table model.
//Below is the snippet of what I have done. 

        private List<Entry> root; 

        public EntryTreeTableModel(List<Entry> root) { 
              this.root = root;
        } 

    public int getChildCount(Object parent) { 

      if (parent instanceof List){ 
             return ((ArrayList<Entry>) parent).size(); 
      }else if (parent instanceof Entry){ 
            return ((Entry)parent).getSubEntries().size(); 
      } 
     return 0; 
   }

   public Object getChild(Object parent, int index) {
        if (parent instanceof List){
            return ((ArrayList<Entry>) parent).get(index);
        }else if (parent instanceof Entry){
            return ((Entry)parent).getSubEntries().get(index);
        }else if (parent instanceof Entry){
            return ((SubEntry)parent); // Hmmm, this feels wrong. Check later.
        }
            return "...";  // Just to indicate that something went wrong
    }

Другие методы следуют тому же подходу

Большое спасибо всем, кто поделился их идеи. Еще одно спасибо Trashgod ...

1 Ответ

4 голосов
/ 14 апреля 2011

Класс org.netbeans.swing.outline.Outline представляется хорошим кандидатом, как предполагает этот пример .В частности, Outline использует javax.swing.tree.TreeModel, который «принимает любой тип объекта в качестве узла дерева».Сравнивая вашу модель с примера , Entry будет соответствовать каталогу, а SubEntry будет соответствовать списку файлов, содержащихся в нем.См. Создание модели данных для связанного примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...