我应该何时创建自己的TableModelListeners和DataModelEvents?
我知道DefaultTableModel
,AbstractTableModel
和TableModel
的区别和用法。
我在许多在线Java示例中看到,在创建扩展DefaultTableModel和AbstractTableModel类的类(自定义模型)时显式创建了TableModelListeners和DataModelEvents。
这是我的理解:
如果我正在扩展DefaultTableModel
,那么这个模型已经知道如何创建DataModelEvents和TableModelListeners(这样我就不必添加它们)监听/观察这些事件并且知道通知TableModelListeners。
如果我正在扩展AbstractTableModel,那么这个模型已经知道如何创建DataModelEvents和TableModelListeners(这样我就不必添加它们)监听/观察这些事件。但我必须显式调用firetablechanged()或类似的方法来通知TableModelListeners有关该事件。
如果我正在实现一个TableModel,那么这个模型已经知道如何创建DataModelEvents但不有任何TableModelListeners(因此我必须添加它们)监听/观察这些事件。而且我还必须显式调用firetablechanged()或类似的方法来向TableModelListeners通知事件。
答案 0 :(得分:3)
DefaultTableModel
(extends AbstractTableModel
),默认情况下所有通知程序(DataModelEvents
)都已正确实施,默认情况下必须仅覆盖可编辑(TableCellEditor
如果需要)和Column Class
(大多数情况下不需要)
AbstractTableModel
,必须覆盖所有required methods
,否则它们无法与DefaultTableModel
进行比较,并且只能处理这些方法的实现方式,默认情况下所有通知程序都是如此(DataModelEvents
)也需要覆盖,否则JTables view
不会显示正确或预期的值
DefaultTableModel
基于过早Arrays
(即使我在HashMap
中看到DefaultTableModel
,也没有问题),AbstractTableModel
允许实现各种{ {1}}没有任何限制(在具体数组API中实现)
使用arrays types
是允许的一切,一切都可以访问(API中实现的方法),与DefaultTableModel
相比,
AbstractTableModel
是关于修改,修改,添加或覆盖方法的,
AbstractTableModel
没有使用JTable
的任何定义XxxTableModel
答案 1 :(得分:3)
我在DefaultTableModel
上推荐@mKorbel,这非常适合可以依赖其简单的变异器的案例。它受到Vector
的内部使用的限制,Collection
是一个受支持但过时的AbstractTableModel
,它带来(可能)不必要的同步开销。
JTable
在将应用程序的数据模型公开到DefaultTableModel
视图时提供了更多flexibility。它应该用于JTable
不适合的情况。
专注于您的问题,TableModelListener
实施TableModel
,并且它会监听自己的AbstractTableModel
。任意数量的其他视图也可以侦听同一个模型; DisplayPanel
是一个侦听名为CheckModel
的{{1}}的示例。如果TableModel
包含您的视图所需的数据以进行更新,则TableModelEvent
应触发合适的EventListenerList
。如果没有,您可以使用JTable
使用的相同{{1}}机制定义您自己的事件 types ,描述为here,并提及here。< / p>