Java 图形界面编程 中三种事件处理方法之比较
在Java Swing编程中,通过注册监听器,我们可以监听事件源产生的事件,从而在事件处理程式中处理我们所需要处理的用户行为。
Java Swing中处理各元件事件的一般步骤是:
1. 新建一个元件(如JButton)。
2. 将该组件添加到相应的面板(如JPanel)。
3. 注册监听器以监听事件源产生的事件(如通过ActionListener来回应用户点击按钮)。
4. 定义处理事件的方法(如在ActionListener中的actionPerformed中定义相应方法)。
以上步骤我们可以用多种方法实现。但人们通常用二种方法。第一种方法是只利用一个监听器以及多个if语句来决定是哪个元件产生的事件;第二种方法是使用多个内部类来回应不同元件产生的各种事件,其具体实现又分两种方式,一种是匿名内部类,一种是一般内部类。
处理事件的第一种方法:利用一个ActionListener来监听事件源产生的事件
Button1.addActionListener(new SimpleListener());
private class SimpleListener implements ActionListener
{
/*
* 利用该内部类来监听所有事件源产生的事件
* 便於处理事件代码模组化
*/
public void actionPerformed(ActionEvent e)
{
// 利用getActionCommand获得按钮名称
// 也可以利用getSource()来实现
// if (e.getSource() ==button1)
String buttonName = e.getActionCommand();
if (buttonName.equals("按钮1"))
JOptionPane.showMessageDialog(frame,
"按钮1 被点击");
else if (buttonName.equals("按钮2"))
JOptionPane.showMessageDialog(frame,
"按钮2 被点击");
else
JOptionPane.showMessageDialog(frame,
"Unknown event" );
}
}
处理事件的第二种方法: 利用匿名内部类来监听每一个事件源产生的事件
button1.addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
JOptionPane.showMessageDialog(frame,
"按钮1 被点击");
}
}
);
处理事件的第三种方法: 利用一般内部类来监听每一个事件源产生的事件
button1.addActionListener(new Button1Handler());
private class Button1Handler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
JOptionPane.showMessageDialog(frame,
"按钮1 被点击");
}
}
利用一个监听器来处理事件的缺点是,当程式比较复杂时,需要一大串的if 语句来实现,程式码较难阅读与维护。当然,如果处理的事件较少,这种方式比较简单。
使用匿名内部类同样存在许多另外的问题。首先,根据元件在代码中被定义的不同位置,类的定义以及处理事件的代码将分散在程式的各个部分,不是集中在一块,同样不便於阅读与维护。各事件的处理全部由嵌套的程式块组成,视觉上很难定位程式码。如果事件处理程式比较复杂,内部类中的代码将变得很长,你将找不到相应的组件定义位置。最後,当工具栏、功能表栏目等需要处理同样的用户行为时,该方法将使代码更难维护。
使用一般的命名内部类可以解决以上许多问题。所有的事件处理方法都集中在一块,并且都具有有意义的名称,程式非常容易阅读与维护。单个的事件处理程式也可以被工具栏、功能表栏等重复使用,
综上说述,当事件少而简单时,建议用第一种方法处理;当有多个事件源时,我们用getSource()和getActionCommand() 两个方法判断,一般不建议用匿名内部类,而建议大家用自己定义的实现了事件接口的类!