2011-12-22 2 views
2

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

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

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

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

public List<Classroom> classes; 

В принципе, мой набор данных будет classes поле в классе контроллера и два JTable: придется показать вещи в различные пути. А именно, 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 и создать две разные TableModels для данных, которые я хочу показать; что я не получаю:

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

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

ответ

3

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

+0

почему 2? если вы просто используете ту же таблицу, что и для 2-го, она просто работает? – Peter

+1

@Peter, у них разные числа строк – StanislavL

+0

извините, пропустил эту часть – Peter

4

@ 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) {…} 
} 
Смежные вопросы