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