Метод перерисовки JList в многопоточном режиме

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

    itemListModel.clear();

    ArrayList resultArrayList = DBQueries.getAllSubmittedSaleTransaction();
    Iterator iterate = resultArrayList.iterator();

    int i = 0;
    while (iterate.hasNext()) {
        Hashtable data = (Hashtable) iterate.next();            
        itemListModel.add(i, data);

        this.itemList.addNotify();
        this.itemList.validate();
        this.itemList.repaint();

        i++;
    }
    this.validate();
    this.repaint();

но проблема в том, что метод перерисовки иногда работает, а иногда нет. Есть ли какой-нибудь умный способ сделать это?

заранее спасибо


person Norks    schedule 18.02.2013    source источник


Ответы (1)


Вам не нужно перерисовывать JList, если вы обновляете модель, особенно если ваша модель вызывает fireContentsChanged(...) после добавления новых данных. Обязательно изменяйте модель только в потоке событий Swing.

Считайте, что вы

  • Выполните запрос к базе данных в SwingWorker.
  • Добавьте прослушиватель PropertyChangeListener в SwingWorker.
  • Когда свойство состояния SwingWorker изменяется на SwingWorker.StateValue.DONE, графический интерфейс получает новые данные от SwingWorker и заполняет ListModel в EDT.
  • А затем пусть ваша ListModel запустит свой метод fireContentChanged(...).
  • ListModel должен расширять AbstractListModel.
  • Обратите внимание: если вы можете использовать DefaultListModel, вам даже не нужно вызывать метод fireContent....(), так как DefaultListModel сделает это за вас.
person Hovercraft Full Of Eels    schedule 18.02.2013
comment
+1, когда я иногда вижу это слово, я думаю, что код обновления графического интерфейса не выполняется в EDT. - person camickr; 18.02.2013