Java - TableModelListeners和DataModelEvents

时间:2013-01-11 20:14:24

标签: java swing tablemodel abstracttablemodel defaulttablemodel

我应该何时创建自己的TableModelListeners和DataModelEvents?

我知道DefaultTableModelAbstractTableModelTableModel的区别和用法。

我在许多在线Java示例中看到,在创建扩展DefaultTableModel和AbstractTableModel类的类(自定义模型)时显式创建了TableModelListeners和DataModelEvents。

这是我的理解:

  1. 如果我正在扩展DefaultTableModel,那么这个模型已经知道如何创建DataModelEvents和TableModelListeners(这样我就不必添加它们)监听/观察这些事件并且知道通知TableModelListeners。

  2. 如果我正在扩展AbstractTableModel,那么这个模型已经知道如何创建DataModelEvents和TableModelListeners(这样我就不必添加它们)监听/观察这些事件。但我必须显式调用firetablechanged()或类似的方法来通知TableModelListeners有关该事件。

  3. 如果我正在实现一个TableModel,那么这个模型已经知道如何创建DataModelEvents但有任何TableModelListeners(因此我必须添加它们)监听/观察这些事件。而且我还必须显式调用firetablechanged()或类似的方法来向TableModelListeners通知事件。

2 个答案:

答案 0 :(得分:3)

  1. DefaultTableModelextends AbstractTableModel),默认情况下所有通知程序(DataModelEvents)都已正确实施,默认情况下必须仅覆盖可编辑(TableCellEditor如果需要)和Column Class(大多数情况下不需要)

  2. AbstractTableModel,必须覆盖所有required methods,否则它们无法与DefaultTableModel进行比较,并且只能处理这些方法的实现方式,默认情况下所有通知程序都是如此(DataModelEvents)也需要覆盖,否则JTables view不会显示正确或预期的值

  3. DefaultTableModel基于过早Arrays(即使我在HashMap中看到DefaultTableModel,也没有问题),AbstractTableModel允许实现各种{ {1}}没有任何限制(在具体数组API中实现)

  4. 使用arrays types是允许的一切,一切都可以访问(API中实现的方法),与DefaultTableModel相比,

  5. AbstractTableModel是关于修改,修改,添加或覆盖方法的,

  6. 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>