问题是 swing 如何处理听众。在此示例中,焦点是 TableModelListener
。
我的表模型(让我们称之为TableModelImpl
)是从AbstractTableModel
扩展而来的。在这个表模型和 JTable
之间,我有一个名为 TableSorter
的类,它就像 TableModelImpl
的装饰器(以及 TableSorter
) code> 还扩展了 AbstractTableModel
)。 TableSorter
通过关联链接到 TableModelImpl
,所以我的意思是 TableSorter
保存对 TableModelImpl
的引用。此外,TableSorter
具有 TableModelListener
类型的成员,它监听我的 TableModelImpl
对象。 JTable
依次监听 TableSorter
。
因此,总的来说,可以说 JTable
对象监听 TableSorter
,它监听我的 TableModelImpl
。所以问题是:这是如何运作的?例如,假设我想在 TableModelImpl
对象上调用 TableModelStructureChanged()
,该事件是否会通过 转发到
呢?JTable
那么 TableSorter
所以,一些简短的例子:
public class TableModelImpl extends AbstractTableModel {
private boolean enabled;
public TableModelImpl(//non relevant parameter, linked to data) {
//Irrelevant code binds model to the data
this.enabled = false;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
fireTableStructureChanged();
}
// More irrelevant code
}
public class TableSorter extends AbstractTableModel {
private TableModel tableModel;
private MouseListener mouseListener;
private TableModelListener tableModelListener;
public TableSorter() {
this.mouseListener = new MouseHandler();
this.tableModelListener = new TableModelHandler();
}
public TableSorter(TableModel tableModel) {
this();
setTableModel(tableModel); //Adds this.tableModelListener to tableModels listenerList
}
}
所以如果我执行以下操作:
TableModelImpl tm = new TableModelImpl();
TableSorter sorter = new TableSorter(tm);
JTable table = new JTable(sorter);
tm.setEnabled(true);
JTable 会收到通知吗?
最佳答案
Swing 是 Java 中最著名的设计模式的出色实现,例如 Model-View-Controller
(大多数时候称为MVC),Singleton
, Factory
, Observer
等等
很多JComponents
如JTable
, JList
或JComboBox
正在实现MVC模式。
在许多情况下,当模型发生变化时,可以使用像fireTableDataChanged()
这样的方法被调用,它负责迭代添加到模型中的监听器列表并调用它们的 tableChanged(TableModelEvent tme)
方法。因此,由于模型的更改,任何其他组件(例如 View )都会收到通知来更新其状态。
当 fireTableStructureChanged()
时同样适用叫做。自 JTable
正在实现TableModelListener
接口(interface)并将自身注册为它的 TableModel
的监听器,当您调用 fireTableStructureChanged()
时会自动通知.
查看 JTable
的源代码很有帮助和AbstractTableModel
了解发射和聆听TableModelEvent
的机制s。
[更新]
没有什么神奇的方法,只有方法调用。在 AbstractTableModel
有一个List<TableModelListener>
叫listenerList
。另一方面,JTable
正在实现TableModelListener
界面。在 JTable
的构造函数中类,JTable
将自身添加到模型中的监听器列表中。所以当 TableModel
发生任何事情时及其 fireXXX()
方法被调用,唯一的魔力是迭代 listenerList
并调用“tableChanged”方法。自 JTable
位于列表中,则 JTable
的“tableChanged”被调用。
希望这会有所帮助。
关于java - Java Swing 中如何处理监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37160926/