继上一章,下面介绍一种更优雅的方式使事件监听器访问事件源对象成员。把监听器定义为内部类!
改进后的代码如下:
/**
*
*/
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Set;
import javax.swing.*;
import javax.swing.event.*;
/**
* @author wangyubin
* 点击按钮,让第一个文本框中的数与第二个文本框中的数相加
* 持有对方的引用 在监听器中传入JFrame容器,则可以在监听中得到全部成员变量。这叫做门面模式,通过一个门面与其内部成员打交道
*/
public class TFMath {
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
new TFFrame().launchFrame();
}
}
class TFFrame extends JFrame{
JTextField num1,num2,num3;
public void launchFrame(){
num1=new JTextField(10);
num2=new JTextField(10);
num3=new JTextField(15);
JLabel lb1Plus=new JLabel("+");
JButton btnEqual=new JButton("=");
btnEqual.addActionListener(new MyMonitor());
setLayout(new FlowLayout());
add(num1);
add(lb1Plus);
add(num2);
add(btnEqual);
add(num3);
pack();
setVisible(true);
}
class MyMonitor implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
int n1=Integer.parseInt(num1.getText());
int n2=Integer.parseInt(num2.getText());
num3.setText(""+(n1+n2));
}
}
}
这是一种常用的方式。另外还可以在内部类前加入private以免被其他类意外调用。
注意,在类里边定义的类叫做内部类,它与类中的方法是平级的,而在方法中定义的类叫做局部类,它比内部类更局部。
当含有内部类的类被编译时会生成一个“类名$内部类名.class” 的文件,如把上面代码编译后,将生成三个文件,分别是:TFMath.class,TFFrame.class和TFFrame$MyMonitor.class
其实在之前的事件监听中使用的类只是在awt.event包中的接口,注意到还有一个Swing.event的包,相信里面会有更好用的事件监听接口。
本文介绍了一种使用内部类作为事件监听器的设计方法,通过在监听器中持有外部类的引用,可以方便地访问外部类的成员变量。这种方式遵循了门面模式的原则,简化了对外部类成员的访问。
726

被折叠的 条评论
为什么被折叠?



