Java Swing中的多个模型组件实例?

时间:2011-06-29 12:40:53

标签: java model-view-controller swing jtable tablemodel

到目前为止,我为相应的Java Swing组件设置了不同的模型类,例如,我为多个TableModel提供了多个JTable。每个JTable都有自己的TableModelTableModel基于一个对象(Model),提供所有必需的数据。像这样:

public class MyTableModel extends AbstractTableModel {

Model model;

但现在我想做出改变。我的界面提供了多个Model实例的可能性。所以我的问题是,我该怎么做?

  • MyTable
  • 实例化多个对象
  • 在用户交互时动态更改当前对模型的引用

所以我面临的基本问题是:我想使用相同的JTable TableModel。我应该使用多个TableModel还是应该使用更改对数据源的引用?


类似的问题:

我想提供多个标签,它们会更改底层模型的实例。不要改变类型,而是改变当前实例 - 意思是数据改变。

我现在应该:

  • 实例化视图组件的多个对象?例如,为每个可用模型实例化一个自己的JTableJPanelJScrollPane对象?
  • 通过在选项卡式窗格上侦听更改事件来动态更改底层模型的引用

2 个答案:

答案 0 :(得分:2)

如果表的结构保持不变(即相同数量的列,相同的标题,相同的列类),并且只更改其内容,则应保留相同的模型实例但更改数据(并调用{{1 }})。 这将更有效,并将允许保持当前列顺序,当前排序列等

如果表的结构完全改变,更改模型本身可能更容易。您也可以调用fireTableDataChanged,但此方法的javadoc说:

  

这跟打电话一样   JTable上的setModel(TableModel)

关于选项卡,可以遵循相同的规则。

答案 1 :(得分:1)

如果您要使用具有不同模型的不同选项卡的多个选项卡,那么答案很简单,您需要不同的表。每个标签至少有一个。

同样,如果你有多个标签,那么你还需要多个JScrollPanes等等。

但是,如果您要为表创建一个单独的位置,如果您没有对表进行自定义操作,则可以使用单个JTable和多个模型。 (见mKorbel的评论)。无论哪种方式,您都可以重用相同的JScrollPane。