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

标签 java swing events abstracttablemodel tablerowsorter

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

相关文章:

java - 如何在 JasperReports 中使用现有的 PDF 信笺

java - 如何用netty实现机器人

Java Combobox 与 Arraylist 错误

java - 从JList中拖动对象,具有重影效果

java - 无法使用 Java 代码从组合框中获取选定的值

magento - paypal付款后如何更新订单详情?

javascript - Angular 事件仅触发一次,触发多次

java - 关系非主键@OneToOne Hibernate JPA

java - Android 计时器更新 TextView (UI)

jquery - 使用 jQuery 将事件监听器添加到动态添加的元素