如何在Java Swing中处理侦听器?

时间:2016-05-11 11:13:43

标签: java swing events abstracttablemodel tablerowsorter

问题是swing如何处理听众。在这个例子中,焦点是TableModelListener

表格模型(我们称之为TableModelImpl)我从AbstractTableModel扩展而来。在此表格模型和JTable之间,我有一个名为TableSorter的类,它类似于TableModelImpl的装饰器(而TableSorter也扩展了AbstractTableModel)。 TableSorter通过关联链接到TableModelImpl,所以我的意思是TableSorter包含对TableModelImpl的引用。此外,TableSorter具有类型为TableModelListener的成员,它会侦听我的TableModelImpl对象。 JTable会依次收听TableSorter

一般来说,可以说JTable对象会侦听TableSorter,它会监听我的TableModelImpl。所以问题是:这是如何工作的?例如,假设我想在TableModelStructureChanged()对象上调用TableModelImpl,此事件是否会通过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?

1 个答案:

答案 0 :(得分:2)

Swing是java中大多数知名设计模式的一个很好的实现,例如Model-View-Controller(大多数时候被称为 MVC ),Singleton,{{1 },Factory等等。

许多Observer,例如JComponentsJTableJList正在实施 MVC 模式。

在更改模型的许多情况下,会调用类似JComboBox的方法,该方法负责迭代添加到模型的侦听器列表并调用其fireTableDataChanged()方法。因此,由于模型的更改,将通知任何其他组件(例如视图)更新其状态。

调用tableChanged(TableModelEvent tme)时也适用。由于fireTableStructureChanged()正在实施JTable界面,并将自己注册为TableModelListener的监听者,因此当您致电TableModel时会自动通知。

有必要查看fireTableStructureChanged()JTable的源代码,以了解触​​发和聆听AbstractTableModel的机制。

<强> [UPDATE]

没有神奇的方法,只是方法调用。在TableModelEvent中有AbstractTableModel名为List<TableModelListener>。另一方面,listenerList正在实现JTable接口。在TableModelListener类的构造函数中,JTable将自身添加到模型中的侦听器列表中。因此,当JTable发生任何事情并且其TableModel方法被调用时,唯一的魔法是迭代fireXXX()并调用'tableChanged'方法。由于listenerList位于列表中,因此调用了JTable的“tableChanged”。

希望这会有所帮助。