автоматическое обновление столбцов jtable при изменении модели

У меня есть класс, реализующий интерфейс TableModel. Когда я вызываю setModel на своем jTable и устанавливаю свой класс в качестве модели, а затем вызываю jTable.updateUI();, все в порядке. Но в некоторых случаях я хочу изменить модель с другой структурой. Отображение данных по-прежнему работает нормально, но мои столбцы не обновляются. Есть ли способ заставить мою таблицу также обновлять столбцы из новой модели?


person soupdiver    schedule 20.06.2012    source источник
comment
Реализация вашей модели неверна. Код приложения никогда не вызывает updateUI.   -  person kleopatra    schedule 20.06.2012


Ответы (4)


Модель должна запустить соответствующее событие, например: fireTableStructureChanged, если изменились и данные, и структура.

http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#fire

person Puce    schedule 20.06.2012
comment
но я не расширяю AbstractTableModel я использую интерфейс - person soupdiver; 20.06.2012
comment
следует по ссылке (добавлено +1) этот ответ верен на ваш слишком широкий вопрос, чтобы лучше помочь раньше опубликовать SSCCE - person mKorbel; 20.06.2012
comment
Скорее всего, вы действительно должны. DefaultTableModel — это подход, очень ориентированный на данные, а не на объектно-ориентированный подход, что приводит ко многим проблемам проектирования. С другой стороны, пользовательская модель (обычно основанная на AbstractTableModel) может охватывать список объектов. - person Puce; 20.06.2012
comment
Вы пишете, что у вас есть класс, реализующий TableModel. Затем вы должны обязательно уведомить слушателей, если были какие-то изменения. AbstractTableModel предоставляет несколько вспомогательных методов. - person Puce; 20.06.2012

  • jTable.updateUI(); – это метод, соответствующий внешнему виду, не используйте его.

У меня есть класс, реализующий интерфейс TableModel.

person mKorbel    schedule 20.06.2012
comment
Но моя модель также расширяется от Observer, поэтому я не могу просто перейти на расширение DefaultTableModel - person soupdiver; 20.06.2012
comment
java.util.Observer это интерфейс или о каком Observer вы говорите? - person Puce; 20.06.2012
comment
АХ, извините, я имел в виду Observable - person soupdiver; 20.06.2012

Если, как и я, вы просто пишете небольшой хак, вы можете рассмотреть возможность использования метода .repaint() вместо метода .updateUI().

Я использовал это, потому что я не использую TableModel, но у меня просто есть данные в Object[][], как и в первом примере учебника по солнцу (ну, оракулу).

person lut    schedule 23.01.2013
comment
нет, перерисовка не требуется для модели с хорошим поведением (и обратите внимание: всегда есть модель, управляющая JTable, хотя это может быть неизменяемая реализация) - person kleopatra; 23.01.2013

Попробуйте это (вставьте после строки setModel(myTableModel);):

myJTable.createDefaultColumnsFromModel();

В моем случае это решило проблему с обновлением, в то время как: .repaint(), .invalidate(), .fireTableDataChanged() не помогли.

person vvinjj    schedule 22.01.2014
comment
нет, это не метод, вызываемый кодом приложения: происходит автоматически в setModel (при условии, что вы не изменили значение true по умолчанию для autoCreateColumns). Если это помогает в вашем контексте, что-то не так в другом месте - person kleopatra; 23.01.2014