我有一个创建修改项目表的表类。我想使用表格模型在 JTable 中显示这些项目。对我来说,表格模型属于我的 GUI 包,但表格需要表格模型才能触发更改,表格模型需要表格类才能显示它,所以我不能将两者分开。如果您需要这样做,您使用的类结构是什么?还是我的思维有流动性并且它们属于同一个包?
5 回答
ATableModel
是一个适配器。我总是将表模型编写为扩展AbstractTableModel
并将其作为我的 GUI 面板类的私有内部类。您只需填写几个方法:getRowCount
,getColumnCount
和getValueAt
你的 GUI 类应该可以访问一些控制器,它可以从中填写这些信息。当您的控制器发现数据更新时,它应该通知您的 GUI 类,然后该类可以调用AbstractTableModel.fireTableDataChanged
或其他适当的方法。
永远不要使用DefaultTableModel
该类,因为您必须使表模型的数据与控制器的数据保持同步。JTable
正如我所说,表模型是一个适配器,它以一种可以理解的方式呈现控制器的数据
对我来说,tablemodel 是小部件的一部分,即 GUI。我不会依赖我的业务逻辑类中的 javax.swing 包。
因此,您将使用适配器或其他机制从业务层加载您的表模型,但这种分离程度可能很有用。
该决定还取决于项目的规模,并且可能比这复杂得多。例如,查看jgoodies 绑定框架和文档以获得更抽象的案例。
模型是保存数据的位。它应该像此类模型一样维护和触发侦听器。
现在您可能需要模型中的某种委托来转换数据或调整类型。因此,您将数据保存在与 javax.swing.table 无关的模型对象中。然后实现一个委托给你的底层模型的 TableModel。使用该 TableModel 创建一个 JTable,但不引用底层模型。
我强烈建议任何从事重要表格或列表驱动开发的人看看Glazed Lists - 我已经编写自定义 TableModel 和 CellRenderers 多年,与 JGoodies 绑定等......我大约一年前偶然发现了 GL,以及我的开发从未如此 - Glazed Lists 方法令人震惊。
GL 有两个特点使其成为基于列表的数据绑定和处理的首选框架:
- 非常非常容易做你想做的正常事情
- 使您可以做您可能想做的非常非常困难的事情
看看你是否没有印象。我强烈建议先玩示例应用程序,然后观看一些屏幕截图,这些屏幕将引导您完成实际的编码过程。
表模型不需要知道它放入的表的任何信息。我将表模型放在模型包中,将表放在视图包中。控制器负责向模型包询问模型,向视图包询问表格,并在表格中设置该模型。