什么时候应该创建自己的TableModelListeners和DataModelEvents?
我知道DefaultTableModel
,AbstractTableModel
和TableModel
的区别和用法。
我在许多在线Java示例中都看到过,其中在创建扩展DefaultTableModel和AbstractTableModel类的类(自定义模型)时显式创建了TableModelListeners和DataModelEvents。
这是我的理解:
如果我要扩展DefaultTableModel
,那么此模型已经知道如何创建DataModelEvents和TableModelListeners(这样我就不必添加它们)侦听/观察这些事件,并且还知道通知TableModelListeners。
如果我要扩展AbstractTableModel,则此模型已经知道如何创建DataModelEvents和TableModelListeners(这样我就不必添加它们)侦听/观察这些事件。但是我必须显式调用firetablechanged()或类似方法来将事件通知给TableModelListeners。
如果我正在实现TableModel,则此模型已经知道如何创建DataModelEvents,但是没有任何TableModelListeners(因此我必须添加它们)来监听/观察这些事件。而且,我还必须显式调用firetablechanged()或类似方法来将事件通知给TableModelListeners。
最佳答案
我遵照DefaultTableModel
上的@mKorbel,它非常适合可以依赖其直接变量的情况。它受内部使用Vector
的限制,Collection
是受支持但已过时的AbstractTableModel
,它(可能)带有不必要的同步开销。JTable
在将应用程序的数据模型暴露于DefaultTableModel
视图中提供了更多的flexibility。在JTable
不适合的情况下应使用它。
专注于您的问题,TableModelListener
实现了TableModel
,并且监听了自己的DisplayPanel
。任意数量的其他视图也可以侦听同一模型。 AbstractTableModel
是侦听名为CheckModel
的TableModel
的示例。如果TableModelEvent
包含视图更新自身所需的数据,则应触发合适的EventListenerList
。如果不是,则可以使用与JTable
相同的机制(定义为here和提到的here)定义自己的事件类型。