1

我应该什么时候创建自己的 TableModelListeners 和 DataModelEvents?

我知道 a 和 的区别和DefaultTableModel用法 。AbstractTableModelTableModel

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

这是我的理解:

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

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

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

4

2 回答 2

3

I defer to @mKorbel on DefaultTableModel, which is well suited to cases that can rely on its straightforward mutators. It is limited by the internal use of Vector, a supported but obsolescent Collection that carries (possibly) needless synchronization overhead.

AbstractTableModel offers much more flexibility in exposing your application's data model to a JTable view. It should be used in cases for which DefaultTableModel is unsuitable.

Focusing on your question, JTable implements TableModelListener, and it listens to its own TableModel. An arbitrary number of other views can also listens to the same model; DisplayPanel is an example that listens to an AbstractTableModel named CheckModel. Your TableModel should fire a suitable TableModelEvent if it contains the data needed by your view(s) to update themselves. If not, you can define your own event types using the same EventListenerList mechanism used by JTable, described here, and mentioned here.

于 2013-01-12T03:18:59.233 回答
3
  1. DefaultTableModel( extends AbstractTableModel),默认情况下,所有通知程序 ( DataModelEvents) 都已正确实施,默认情况下必须仅覆盖可编辑的(TableCellEditor如果需要)和Column Class(在大多数情况下不需要)

  2. AbstractTableModel, 必须覆盖 all required methods,否则它们与 相比不起作用DefaultTableModel,并且仅适用于这些方法的实现方式,默认情况下,所有通知器 ( DataModelEvents) 也需要覆盖,否则JTables view不会显示正确或预期的值

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

  4. 通过 usingDefaultTableModel是允许的一切,一切都是可访问的(在 API 中实现的方法),相比之下AbstractTableModel

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

  6. forJTable没有任何XxxTableModel定义 DefaultTableModel

于 2013-01-11T21:51:46.743 回答