Несколько экземпляров компонентов модели в Java Swing?

До сих пор у меня были разные классы моделей для соответствующего компонента Java Swing, например, у меня есть несколько TableModel для нескольких JTable. У каждого JTable есть свой TableModel. TableModel основан на одном объекте (Model), дающем все необходимые данные. Что-то вроде этого:

public class MyTableModel extends AbstractTableModel {

Model model;

Но теперь я хотел бы внести изменения. Мой интерфейс предлагает возможность нескольких экземпляров Model. Итак, мой вопрос, что мне делать?

  • создать несколько объектов из MyTable
  • динамически изменять текущую ссылку на модель при взаимодействии с пользователем

Итак, основная проблема, с которой я столкнулся: я хочу использовать тот же JTable с тем же TableModel. Должен ли я использовать несколько TableModel или мне следует использовать изменяющиеся ссылки на источник данных?


Аналогичный вопрос:

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

Должен ли я сейчас:

  • создавать экземпляры нескольких объектов компонентов представления? Например, создать для каждой доступной модели собственный объект JTable, JPanel, JScrollPane?
  • изменяться динамически, прослушивая события изменения на панели с вкладками, ссылка на базовую модель

person Konrad Reiche    schedule 29.06.2011    source источник
comment
для меня всегда каждый JTable имеет свою собственную TableModel, поэтому каждый JTable может иметь разные TableModel (Defalut/Abstract), разные ColumnModel, RowModel, RowFilter, RowSorter, правила MVC и заканчиваться определениями в prepareRenderer, в любом случае хороший вопрос +1   -  person mKorbel    schedule 29.06.2011


Ответы (2)


Если вы собираетесь иметь несколько вкладок с другой вкладкой, имеющей другую модель, тогда ответ прост, вам нужны разные таблицы. Хотя бы по одному на каждую вкладку.

Опять же, если у вас несколько вкладок, вам также понадобится несколько JScrollPanes и т. д.

Однако, если вы собираетесь иметь одно место для стола, вы можете обойтись одним JTable и несколькими моделями, если вы не делаете что-то нестандартное для стола. (См. комментарий mKorbel). В любом случае вы можете повторно использовать один и тот же JScrollPane.

person jzd    schedule 29.06.2011

Если структура таблицы остается прежней (т. е. такое же количество столбцов, те же заголовки, те же классы столбцов) и изменяется только ее содержимое, вы должны сохранить тот же экземпляр модели, но изменить данные (и вызвать fireTableDataChanged). Это будет более эффективно и позволит сохранить текущий порядок столбцов, текущий отсортированный столбец и т. д.

Если структура таблицы полностью меняется, возможно, проще изменить саму модель. Вы также можете вызвать fireTableStructureChanged, но javadoc этого метода говорит:

Это то же самое, что и вызов setModel(TableModel) в JTable.

В отношении вкладок можно придерживаться того же правила.

person JB Nizet    schedule 29.06.2011