写在前面:
前两篇博客我们分别介绍了简单java GUI的基本结构及事件监听机制。这一次我们将介绍双事件(多事件)监听机制,并引入内部类。
1.设计任务
设计一个GUI,包含基本组件:按钮(两个),标签(一个),随机颜色圆-面板(一个),要求点击其中一个按钮可以改变标签文字,点击另一个按钮可以改变圆的颜色,实现双事件监听。
2.任务分析
本任务的难度在于双事件如何同时监听。我们已经知道,要实现事件监听,就必须实现ActionListener接口并具体实现actionPerformed方法。但是注意对于任何一个实现ActionListener接口的类而言,只能实现一个actionPerformed方法,那么如何对两个不同的按钮实施监听并且有不同的actionPerformed方法处理呢?我们使用内部类解决这个问题。内部类的形式如下所示:
class Outer {
int outer_int;
class Inner {
int inner_int;
}
使用内部类的一个好处是在内部类中,可以直接使用外部类中的属性和方法。我们用以下代码试图实现本设计任务。
3.代码Version1
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class newTwoButtons {
JFrame frame;
JLabel label;
public static void main(String[] args) {
newTwoButtons tb = new newTwoButtons();
tb.go();
}
public void go() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
label = new JLabel("I am waiting for you!");
JButton labelButton = new JButton("Change a label");
labelButton.addActionListener(new LabelListener());
JButton circleButton = new JButton("Change a circle");
circleButton.addActionListener(new CircleListener());
MyDrawPanel myPanel = new MyDrawPanel();
frame.getContentPane().add(BorderLayout.EAST, labelButton);
frame.getContentPane().add(BorderLayout.SOUTH, circleButton);
frame.getContentPane().add(BorderLayout.WEST, label);
frame.getContentPane().add(BorderLayout.CENTER, myPanel);
frame.setSize(300, 300);
frame.setVisible(true);
}
class LabelListener implements ActionListener {
public void actionPerformed(ActionEvent event) {