现在很多JAVA书籍,在介绍SWING的事件模型时,为了使JAVA初学者容易理解和上手,通常是在主类(自己的JFrame子类或JPanel)中做所有事情:要么由主类作为监听器,在接口的方法中通过判定事件源来决定具体做何事;
作者:中国IT实验室 来源:中国IT实验室 2007年8月26日
关键字:
我们又提供了一个不带参数的多态getList()方法来返回整个列表。
现在让我们进入程序中的第一个重要的部分,为了显示这些孩子的姓名,我们需要为三个单选按钮都添加一个事件监听器,使得每个都能显示出正确的孩子们:
public void actionPerformed(ActionEvent e){
//listen for button clicks and do the right thing
Object obj=e.getSource();
if(obj==female) loadFemales();
if(obj==male) loadMales();
if(obj==both) loadBoth();
}
private void loadFemales(){
//display female swimmers
Vector v=swimmers.getList(true);
loadList(v);
}
private void loadMales(){
//display male swimmers
Vector v=swimmers.getList(false);
loadList(v);
}
尽管这个方法在简单、小型的情况下工作得很好,但是它没有良好的可扩展性。如果你有10个按钮,扩展actionPerformed()方法来测试每个按钮和调用某些对应的操作,会使得可读性非常差。相反,我们最好在包含用户接口的类中去掉所有的判定。
做到这点的一个途径是使用Command模式。当我们使用这个模式的时候,需要我们创立一个Command接口:
//the Command interface
public interface Command{
public void execute();
}
我们将三个单选按钮扩展成特定的带有Command接口的类,我们就可以把对命令的执行从JFrame类转移到每个按钮的类。同时,我们创建一个叫做SexButton的基类,并将ActionListener代码移到基类中,这样就不需要分别在每个按钮中添加事件监听器:
//abstract radio button class
public abstract class SexButton
extends JRadioButton implements Command{
protected Swimmers simmers;
//JawList is a subclass of JScrollPane contained a JList;
protected JawList kidList;
public SexButton(String title,Swimmers sw,
JawList klist,ActionListener al){
super(title);
swimmers=sw;
kidList=klist;
addActionListener(al);
}
//abstract execute method
public abstract void execute();
}
注意这个类必须被扩展以使得它有用,因为我们没有具体化execute()方法。这个基本的抽象按钮类只是我们从中导出的具体类的一个模板,这实际也是模板设计模式的一个简单例子。
//radio button to select female swimmers
public class FemaleButton extends SexButton{
public execute(){
Vector v=swimmers.getList(true);
loadList(v);
}
private void loadList(Vector v){
kidList.clear();
for(int i=0;i<v.size();i++){
Swimmer swm=(Swimmer)v.elementAt(i);
kidList.add(swm.getName());
}
}
}