Проблемы с пониманием того, как использовать табличные модели и наблюдаемые вместе - PullRequest
0 голосов
/ 14 декабря 2011

У меня есть довольно сложные данные, и в данный момент я нахожусь в хеш-таблицах, которые указывают на другие классы, которые также содержат хеш-таблицы, потому что в данных, которые я пытаюсь сохранить, есть множество отношений.

с другой стороны, у меня есть таблица, которая работает довольно хорошо, за исключением того, что она не имеет никакого отношения к моей модели данных.У него есть своя настольная модель.Я создаю его очень простым способом -

Object[][] tableData = new Object[4][ tableHeaders.length ];
modelTablet  = new TabletTableModel(tableData, tableHeaders );

моя модель данных планшета очень проста,

class TabletTableModel extends DefaultTableModel {

   public TabletTableModel(Object rowData[][], Object columnNames[]) {
      super(rowData, columnNames);
   }

   @Override
   public Class getColumnClass(int col) {
        if (col == 0) {
           return String.class;
        } else {
           return Double.class;
        }
   }

   @Override
   public boolean isCellEditable(int row, int col)
   {
      if (col == 0 || col == activeColumn)
         return true;
      else
         return false;
   }
}

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

class AddRowActionListener implements ActionListener {
    public void actionPerformed(ActionEvent event) {
    DefaultTableModel model = (DefaultTableModel)tableTablet.getModel();
    model.addRow(new Object[3]);
    System.out.println(Arrays.deepToString(tableData));
    }
}

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

Пока все хорошо, но для моего интерфейса у меня есть вторая таблица, в которой обобщены результатыПервый столЭто всего три строки, без заголовка.Я думаю, что, возможно, я проделал больше работы, чем мне было нужно, когда я сделал это.

modelSummary = new SummaryTableModel(1, tableHeaders.length);
tableSummary = new JTable(modelSummary);

class SummaryTableModel extends DefaultTableModel {

   public SummaryTableModel(int rows, int columns) {
      super(rows, columns);
   }

   @Override
   public Class getColumnClass(int col) {
        if (col == 0) {
           return String.class;
        } else {
           return Double.class;
        }

   @Override
   public boolean isCellEditable(int row, int col)
   {
      if (col == 1 && activeColumn == 2)
         return true;
      else
         return false;
   }
}

Так что это дает мне хороший набор таблиц, они перекрашивают, как они должны, они ограничивают данные до допустимых значенийи отформатируйте его должным образом (с моими средствами визуализации, которые я не перечислил).

Но вот что должно произойти - пользователь вводит значение в столбец 1 таблицы 1, затем мне нужно суммировать по всем значениямв столбце 1 выведите это значение из столбца 1 таблицы 2, а затем пересчитайте все значения в столбце 2 таблицы 1 на основе этого нового значения.

И наоборот, если столбец 2 является активным столбцом и пользователь изменяетзначение в столбце 2 таблицы 1, тогда мне нужно получить значение столбца 1 в таблице 2 и использовать его для пересчета всех значений столбца 1 в таблице 1, а также суммировать значения столбца 2 и поместить их в столбец 2таблицы 2. С оговоркой, что пользователь не может ввести новое значение, такое, что сумма чисел в столбце 2 превышает 100.

Таблица 2 также может быть отредактирована, что потребовало быe вычисление всех значений в таблице 1.

Итак ... мне кажется, что у меня должна быть наблюдаемая, и я должен зарегистрировать свои таблицы как наблюдатели и как контролеры для наблюдаемой.Таким образом, я могу написать наблюдаемую, но у меня все еще есть две модели таблиц данных.Я много читал, но все примеры, которые я нашел, показывают в наблюдаемой, используемой с чем-то простым, например, с текстовым полем или табличными моделями, но без использования класса Observable.Другая проблема заключается в том, что я не уверен, как делать большинство интересных вещей (таких как добавление строк или проверка типов), которые модель по умолчанию с радостью делает для меня по умолчанию.

Перед тем, как добавить новое измерениесложность моего проекта - кто-нибудь может дать мне несколько советов?Легко ли смешивать модели данных, которые практически не имеют представления о строках или столбцах, с моделями данных таблицы, которые не требуют повторной записи всех операций модели таблицы по умолчанию?Весь процесс кажется мне невероятно сложным в данный момент.Мне отчаянно нужно какое-то четкое объяснение того, как это должно работать.

1 Ответ

1 голос
/ 14 декабря 2011

Модели таблиц уже доступны для наблюдения: вы можете добавить к ним TableModelListener и, таким образом, вызывать их всякий раз, когда происходит изменение в модели таблицы. Итак, вторая модель может быть слушателем первой, и наоборот.

Я обычно не использую DefaultTableModel, потому что он требует от меня преобразования всех моих доменных объектов в массивы. Я обычно просто пишу подкласс AbstractTableModel, который оборачивает список объектов домена. Получение значения ячейки обычно заключается в получении объектной модели по заданной строке (индексу) в списке, а затем в зависимости от столбца вызывается соответствующий метод получения объекта.

Установка значения заключается в вызове соответствующего установщика объекта и запуске события.

См. http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#data для учебника по настольным моделям.

...