2012-06-20 2 views
2

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

+3

Неверная реализация вашей модели. Код приложения _never_ вызывает updateUI. – kleopatra

ответ

6

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

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

+0

, но я не расширяю 'AbstractTableModel'. Я использую интерфейс. – soupdiver

+1

следует ссылке (добавлен +1), этот ответ верен вашему слишком широкому вопросу, для лучшей помощи скорее опубликуйте [SSCCE] (http: // sscce. org /) – mKorbel

+2

Скорее всего, вам действительно нужно. DefaultTableModel - это подход, ориентированный на данные, а не объектно-ориентированный подход, что приводит ко многим проблемам проектирования. Пользовательская модель (обычно основанная на AbstractTableModel), с другой стороны, может обертывать список объектов. – Puce

4
  • jTable.updateUI(); является Внешний вид и соответствующий метод, не используют, что

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

  • you have to override right notifiers методов из TableModel

  • использования DefaultTableModel, есть все оповещатели, реализованные в API,

  • все обновления должно быть сделано на EventDispatchThread

+0

Но моя модель также простирается от 'Observer', поэтому я не могу просто изменить также расширение' DefaultTableModel' – soupdiver

+1

java.util.Observer - это интерфейс или то, что Observer вы говорите? – Puce

+0

AH извините меня Я имел в виду «Observable» – soupdiver

-1

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

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

+0

нет, перекраска не нужна с хорошо продуманной моделью (и примечание: есть _always_ модель, управляющая JTable - это может быть непреложная реализация, хотя) – kleopatra

-1

Try это (вставить после setModel (myTableModel); линия):

myJTable.createDefaultColumnsFromModel(); 

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

+0

нет, это не метод для вызова по коду приложения: происходит автоматически на setModel (при условии, что вы не изменили значение true для autoCreateColumns). Если это поможет в вашем контексте, что-то не так в другом месте – kleopatra

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