任何支持GUI的操作环境都要不断地监视按键或点击鼠标这样的事件。这些事件在报告给正在与逆行的程序,每个程序将决定如何对这些事件做出响应。
10.4.1基本事件处理概念
- 在java AWT中,事件源(如 按钮,滚动条)有一些方法,允许你注册时间监听器,对这些事件做出所需的响应
- 通知一个事件监听器发生了某件事件时,这个事件的相关信息会封装在一个事件对象中,在Java中,所有的事件对象最终都派生于Java.util.EventObject类。当然每个事件类型还有子类,例如,ActionEvent,WindowEvent
- 不同的事件源可以产生不同的类型的事件,例如:按钮可以发送一个ActionEvent对象,而窗口会发送WindowEvent对象
AWT事件处理机制的概要说明:
1.事件监听器是一个实现了监听器接口的类实例
2.事件源对象能够注册监听器对象并向其发送事件对象
3.当事件发生时,事件源将事件对象发送给所有注册的监听器
4.监听器对象再使用事件对象中的信息决定如何对事件做出响应
下面是指定监听器的一个示例:
ActionListener listener=...;
var button=new JButton("按钮名称");
button.addActionListener(listener);
- 现在,只要按钮产生了一个“动作事件”,listener对象就会得到通知。对于按钮来说,动作事件就是点击按钮
- 要实现ActionListener接口,监听器就要实现一个名为actionPerformed的方法,该方法接受一个ActionEvent 对象做参数
- 只要用户点击按钮,JButton对象就会创建一个ActionEvent对象,然后调用listen.actionPerformed(event),并传入这个事件对象。
- 一个事件源可以有多个监听器,按钮就会调用所有监听器的actionPerformed方法
10.4.2 实例:处理按钮点击事件
在这个示例中,我们想要在一个面板放置三个按钮,另外添加三个监听器作为这些按钮的监听器
class ButtonFrame extends JFrame
{
private JPanel buttonPanel;
public static final int DEFAULT_WIDTH = 300;
public static final int DEFAULT_HEIGHT = 200;
public ButtonFrame() throws HeadlessException {
setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
//creatButtons
var yelloButton = new JButton("Yello");
var blueButton = new JButton("Blue");
var redButton = new JButton("Red");
var exitButton = new JButton("Exit");
buttonPanel = new JPanel();
//add buttons to panel
buttonPanel.add(yelloButton);
buttonPanel.add(blueButton);
buttonPanel.add(redButton);
buttonPanel.add(exitButton);
//add panel to frame
add(buttonPanel);
//create button actions
var yelloAction=new ColorAction(Color.YELLOW);
var blueAction=new ColorAction(Color.BLUE);
var redAction=new ColorAction(Color.RED);
//associate actions with buttons
yelloButton.addActionListener(yelloAction);
blueButton.addActionListener(blueAction);
redButton.addActionListener(redAction);
}
private class ColorAction implements ActionListener {
private Color background;
public ColorAction() {
}
public ColorAction(Color background) {
this.background = background;
}
@Override
public void actionPerformed(ActionEvent actionEvent) {
buttonPanel.setBackground(background);
}
}
}
public void actionPerformed(ActionEvent event)
在所有的情况下使用ActionListener接口的方式都是一样的:
actionPerformed方法,将接受一个ActionEvent类型的对象作为参数,这个事件包含了所发生的事件相关信息
方法名 | 作用 |
---|