2013-08-22 5 views
1

Это упрощенная версия того, что я пытаюсь сделать. У меня есть карта, которая отображает целочисленный идентификатор в список строк. Один из этих списков с карты всегда отображается JTable. (В зависимости от того, какой идентификатор должен отображаться) Вся информация для карты поступает из базы данных и постоянно добавляется и удаляется. Мои DATACLASS, которая хранит всю карту и получает обновления из базы данных:Java: Правильный способ обновления данных TableModel?

DataClass { 
    Map(Integer, List<String>) map; 

    // TabelModel gets list here 
    public List<String> getList(int id) { 
     return map.get(id); 
    } 

    // Updates from database come here 
    public updateList(int id, String info) { 
     if (map.containsKey(id) { 
      map.get(id).add(info); 
     } 
     else { 
      map.put(id, new List<String>(info)); 
     } 
    } 

    // Remove from list, etc all down here 
    ... 
} 

Моя таблица модель Класс:

MyTableModel extends DefaultTableModel { 
    List data; 

    public void updateData(int id) { 
     data = getList(id) 
     fireTableDataChanged(); 
    } 

    ... All the other stuff needed ... 
} 

Поскольку обновления базы данных происходит в партиях, я знаю, что в конце я должен обновить таблицу. Таким образом, DataClass сообщает классу пользовательского интерфейса, который информирует таблицу для обновления. Это приводит к тому, updateData(id) называться который возвращает новый набор данных из DATACLASS и называет fireTableDataChanged();

Мой вопрос являются:

  1. Является ли это правильный путь идти об обновлении/хранения данных в таблице ?
  2. Должен ли getList возвращать клон данных? Если я просто верну ссылку, все обновления из базы данных будут обращаться к той же ссылке, и поскольку эти обновления не будут работать в EDT, это не будет плохо/нахмуриться/неправильно?
  3. Как это сделать с помощью событий Java? PropertyChangeEvent? Если да, то как? не
+1

Для более эффективной помощи следует отправить сообщение [SSCCE] (http://sscce.org/). –

ответ

1

В той степени, что ваши вопросы связаны,

  1. Нет; когда новые данные доступны, ваш метод updateData() должен обновить внутреннюю структуру данных вашего TableModel и запустить соответствующее событие; потому что DefaultTableModel ничего не знает о вашем List, extend AbstractTableModel, как показано на рисунке here; JTable будет обновляться в ответ.

  2. Нет; ваш уровень доступа к базе данных не должен содержать ссылок на запрашиваемые объекты, и не требуется клонирование; пересылать запрошенные объекты на ваш экранный слой из метода process()SwingWorker или аналогичного.

  3. Используйте TableModelListener, чтобы узнать, когда и как изменился TableModel; соответственно обновите базу данных.

Смежные вопросы