gpt4 book ai didi

java - Java Swing 中如何处理监听器?

转载 作者:行者123 更新时间:2023-12-02 03:38:19 26 4
gpt4 key购买 nike

问题是 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等等

很多JComponentsJTable , JListJComboBox正在实现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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com