如何使多个jtables共享一个事件处理程序方法

时间:2014-01-26 00:43:53

标签: java swing jtable

我是Java的新手,所以请温柔哈哈。我的问题是这个...我已经习惯了C#,在那里制作多个项目并且拥有所有他们的......单击鼠标事件,转到一个方法可以解决控制它的问题等等。问题是,我无法弄清楚如何在Java中这样做。我有几个JTable,需要一个方法来处理tablemodellistener事件。

import javax.swing.event.*;
import javax.swing.table.TableModel;

public class SimpleTableDemo ... implements TableModelListener {
    ...
    public SimpleTableDemo() {
        ...
        table.getModel().addTableModelListener(this);
        ...
    }

    public void tableChanged(TableModelEvent e) {
        int row = e.getFirstRow();
        int column = e.getColumn();
        TableModel model = (TableModel)e.getSource();
        String columnName = model.getColumnName(column);
        Object data = model.getValueAt(row, column);

        ...// Do something with the data...
    }
    ...
}

所以我尝试更改“table.getModel()。addTableModelListener(this);”

为:

table.getModel()。addTableModelListener([TableModelListener类型的MyMethod]);

但它不会编译。请提供一个完整的示例或非常好的提示。谢谢!

编辑:

我从这里得到了代码:http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#modelchange

2 个答案:

答案 0 :(得分:1)

Java事件处理(遗憾的是)不像C#事件处理那样工作。

所以

  

table.getModel()。addTableModelListener([MyMethod of type   TableModelListener]);

不行。


Java 8及更高版本的更新

使用Java 8和lambda表达式,上述语句不再成立。如果您的班级中的某个方法的签名与tableChanged(TableModelEvent) TableModelListener匹配,则可以写

private void tableChangedEventHandler(TableModelEvent evt) {
    //do stuff
}

table.getModel().addTableModelListener(this::tableChangedEventHandler);

请注意,您不需要实现接口,并且方法名称不应与接口中方法的名称匹配。


现在问题,您需要在其他一个类中实现TableModelListener,其唯一目的是处理事件,我们称之为MyTableModelListener。之后,您可以在任何需要的地方实例化它

table.getModel().addTableModelListener(new MyTableModelListener());

或者如果你真的需要一种方法来处理事件,你可以单独使用

table.getModel().addTableModelListener(MyTableModelListener.getInstance());

答案 1 :(得分:1)

在此example中,单个TableModel有多个听众,包括JTable本身和相邻的JList。每个JComponent都包含EventListenerList,已审核herehere,其中包含该模型的任意数量的事件侦听器。