第一种方式就是使用匿名的内部类,这样可以使得代码结构非常紧凑。比如在一个JPanel上有3个按钮,每个按钮都能改变该panel的背景颜色。由于是3个按钮,因此我们可以把创建按钮的代码写成一个函数来重复调用,并且使用内部匿名类来实现监听器,这样可有效减少代码长度。例子如下:
public class ButtonClickPanel extends JPanel {

public ButtonClickPanel() {
add(createButton("Red", Color.RED));
add(createButton("Blue", Color.BLUE));
add(createButton("Yellow", Color.YELLOW));
}
private JButton createButton(String name, final Color c) {
JButton b = new JButton(name);
b.addActionListener(new
ActionListener()
{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
setBackground(c);
}
});
return b;
}
}
另外一种方法更为简洁,直接使用一个函数生成监听器,而根本不需要自己定义。但是这种方法有一定的局限性,不是很通用。他要求:
1.在监听器内使用的函数不能有参数
2.若监听器内的函数一定需要一个参数,那么这个参数必须可以通过“产生监听事件的组件”的get方法获得。
上述第二点从字面上不是很好理解,我再具体说说。比如我们上面的功能,改变背景色,这一功能就不符合上述两点。首先他需要一个颜色参数,不符合第1点,其次,这个颜色参数不能通过按钮(也就是产生监听事件的组件)的get方法获得,因此也不满足第2点。所以,上述功能不能使用这种方式简化代码。
下面我们把功能修改一下,点击按钮,将外围框架的标题修改为按钮的名字。这一功能就符合上述第2点,因为将标题修改为按钮的名字,而按钮的名字可以通过按钮的getText()方法来获得。代码如下:
public class ButtonClickPanel extends JPanel {

public ButtonClickPanel(JFrame jf) {
frame = jf;
add(createButton("Red"));
add(createButton("Blue"));
add(createButton("Yellow"));
}
private JButton createButton(String name) {
JButton b = new JButton(name);
b.addActionListener(EventHandler.create(ActionListener.class, frame, "setTitle", "source.text"));
return b;
}
private JFrame frame;
}






















另外一种方法更为简洁,直接使用一个函数生成监听器,而根本不需要自己定义。但是这种方法有一定的局限性,不是很通用。他要求:
1.在监听器内使用的函数不能有参数
2.若监听器内的函数一定需要一个参数,那么这个参数必须可以通过“产生监听事件的组件”的get方法获得。
上述第二点从字面上不是很好理解,我再具体说说。比如我们上面的功能,改变背景色,这一功能就不符合上述两点。首先他需要一个颜色参数,不符合第1点,其次,这个颜色参数不能通过按钮(也就是产生监听事件的组件)的get方法获得,因此也不满足第2点。所以,上述功能不能使用这种方式简化代码。
下面我们把功能修改一下,点击按钮,将外围框架的标题修改为按钮的名字。这一功能就符合上述第2点,因为将标题修改为按钮的名字,而按钮的名字可以通过按钮的getText()方法来获得。代码如下:
















