Один и тот же набор данных, два разных JTables - PullRequest
2 голосов
/ 22 декабря 2011

У меня есть некоторые данные, которые я должен показать через две JTables;данные одинаковы, но каждая таблица должна показывать это немного по-разному.Кроме того, я получаю данные от внешнего соединения (в данном случае JMS, но это не имеет значения, это может быть БД или что-то в этом роде).

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

Теперь небольшой пример моегоструктура набора данных, а также некоторые фиктивные данные:

class Student{ String name; Classroom classroom; boolean goodStudent}
class Classroom{ Sting name; List<String> coursesTaught; List<Student> students;}

public List<Classroom> classes;

По сути, мой набор данных будет полем classes в классе Controller, и двум JTables придется показывать вещи по-разному.А именно, Table1 должен будет показать что-то вроде:

Classroom Name | Courses
4a             | CS101, CS102, CS103
4b             | BM101, CS102
4c             | I101, CS4100

Таким образом, в основном, для каждой Классной комнаты, список курсов.

Table2 должен вместо этого показать вещи как:

Student Name   | Good?
Mark Spencer   | true
Philippe Mann  | true
Tom Sayer      | false

Я должен видеть ВСЕХ учеников из всех классных комнат.

Как видите, данные одинаковы, но показаны по-разному.Я хотел бы, чтобы при изменении данных таблицы автоматически обновлялись.Для того, что я понял до сих пор, мне нужно будет создать подкласс AbstractTableModel и создать две разные TableModel для вида данных, которые я хочу показать;я не получаю:

  • Как Модели получат свои данные, когда произойдут какие-то изменения?
  • Кто должен уведомлять модели об этих изменениях?
  • Достаточно ли вызвать функцию «fireTableXXXEvent ()», чтобы вызвать обновление представления?

Надеюсь, я достаточно ясно дал понять ... В любом случае, большое спасибо!Bye

Ответы [ 2 ]

4 голосов
/ 22 декабря 2011

@ StanislavL прав насчет необходимости TableModel для каждого JTable, но ничто не говорит о том, что они не могут с пользой происходить от общего абстрактного родителя.В (несколько надуманном) наброске ниже две модели имеют общую реализацию getColumnCount(), в то время как конкретные дочерние элементы реализуют оставшиеся требуемые TableModel методы.

abstract class SchoolModel extends AbstractTableModel {

    @Override
    public int getColumnCount() { return 2; }
}

class ClassroomModel extends SchoolModel {

    @Override
    public int getRowCount() {…}

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {…}
}

class StudentModel extends SchoolModel {

    @Override
    public int getRowCount() {…}

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {…}
}
3 голосов
/ 22 декабря 2011

Вы правы. Вам нужно 2 AbstractTableModels. Предположим, у вас есть список List classesList classes как основной источник данных. Количество строк первой модели просто вернет size () из списка. Второй вернет сумму количества студентов в каждом классе. Число столбцов для обеих моделей равно 2. Интересными методами являются getValueAt / setValue, и вам нужно найти подходящую строку. Для первого списка это просто подходящий элемент списка. Для второй модели таблицы вы должны вычислить правильную строку, а затем выполнить итерацию по списку студентов. Предположим, что-то изменилось в БД. Вы получаете новый список. Вы можете либо найти то, что изменилось, какие строки / столбцы были вставлены / удалены / изменены, либо просто заменить список источников данных в обеих моделях и событие изменения структуры огня, чтобы JTable полностью обновил содержимое. Нет автоматического обновления моделей. Вы можете написать, например, таймер для проверки изменений каждую секунду / минуту / час или обновления при повторном открытии диалогового окна / фрейма, где отображается таблица.

...