Обновление списка результатов JPA, который связан с таблицей jTable - PullRequest
1 голос
/ 30 апреля 2010

В Netbeans я создал JTable и привязал его значения к набору результатов JPA. Это прекрасно работает. Запрос содержит параметр, который я установил в поле pre-create компонента «результат запроса». Поэтому перед тем, как Netbeans создаст результат запроса, я напишу следующее:

myQuery.setParameter("year", "1997");

Это отлично работает. Теперь у меня есть обработчик событий, который должен изменить параметр и отобразить новые значения в таблице. Итак, я делаю это:

myQuery.setParameter("year", "2005");
myResultList.clear();
myResultList.addAll(myQuery.getResultList());
jTable1.updateUI();

Это работает, но кажется мне неправильным. Примечание: Набор результатов привязан к таблице. Так что я надеялся, что было что-то вроде этого:

myQuery.setParameter("year", "2005");
myResultList.refresh();

Есть ли что-то подобное?

Ответы [ 2 ]

3 голосов
/ 23 июня 2010

Я наконец понял это ...

Корень проблемы лежит в классе JTableBinding. Вот важная выдержка из документа API:

Если список является экземпляром ObservableList, изменения в содержимом списка (такие как добавление, удаление или замена объекта) также отражаются в JTable. Важное замечание: Изменение содержимого ненаблюдаемого Списка, когда он участвует в JTableBinding, не поддерживается, что приводит к неопределенному поведению и возможным исключениям.

И действительно, изменение содержимого списка, пока оно не является наблюдаемым списком, ведет к странному поведению в результирующем пользовательском интерфейсе. Если, например, ваш первоначальный запрос возвращает 1000 строк, а после обновления список содержит только 100 строк, то связанная таблица JTable все еще позволяет вам пытаться прокрутить результаты. И пользовательский интерфейс ненадолго «зависает».

Фактически, когда вы используете JPA в Netbeans и используете соответствующие компоненты из палитры, вы легко можете это исправить. У QueryResult «виджета» есть флажки «наблюдаемые». Проверьте это, и все готово. Теперь все изменения в результате будут автоматически отражены в JTable. Так что вы можете просто сделать:

myQuery.setParameter("year", "2005");
myResultList.clear();
myResultList.addAll(myQuery.getResultList());

ничего не делая.

2 голосов
/ 30 апреля 2010

Да, это неправильно, вы никогда не должны использовать updateUI ().Этот метод используется, когда вы вносите изменение LAF, которого у вас нет.

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

Если привязка воссоздает новую TableModel, вы должны сделать

table.setModel( theNewModel );

Если модель просто обновляется, то она должна вызвать:

fireTableDataChanged(...);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...