事件和事件源:
事件可以定义为程序发生了某些事情的信号.能创建一个事件并触发该事件的组件称为该事件的源对象或源组件.事件类的根类是java.util.EventObject
事件对象包括与事件相关的一切属性,可以使用EventObject中的实例方法getSource()获得事件的源对象。EventObject的子类的对象处理特定类型的事件。如动作事件,窗口事件,组件事件,鼠标事件,按键事件。
java使用一种基于委托的模型来处理事件:原对象触发一个事件,对此事件感兴趣的对象来处理它。将对此事件感兴趣的对象称为监听器(listener)一个对象要成为原对象上的事件监听器,需要具备两个条件。
(1)调用source.addXListener(listener)来注册一个实例。注册方法依赖于事件的类型。如果事件类型是ACtionEvent,那么对应的注册方法是addActionListener.一般来说XEvent的注册命名方法是addXListener.
一个源对象可以触发几种类型的事件。
(2)要定义监听器对象的类,确保监听器有处理这个事件的正确方法。java为每一种类型的事件都提供了监听器接口。通常XEvent的监听器接口是XListener,监听器MouseMotionListener例外。ActionListener的每个 监听器都应该实现ActionListener接口。
注册一个监听器:
JButton jbtOK = new JButton("OK");
ActionListener listener1 = new OKListenerClass();
jbtOK.addActionListener(listener1);
事件对象包含于事件相关的信息,为判断一个对象是按钮,复选框还是单选按钮,,都可以使用e.getSource()方法获得源对象。
写一个程序用两个按钮控制圆的大小
(1)定义名为EnlargeListener的监听类,实现ActionListener
(2)创建一个监听器,并将其注册到jbtEnlarge
(3)在CirclePanel中添加一个名为enlarge()的方法来增加半径,然后重绘
(4)实现EnlargeListener中的actionPerformed方法来调用canvas.enlarge()
(5)为了让actionPerformed方法能够访问引用变量canvas,将EnlargeListener定义为ControlCircle类的内部类
import
javax.swing.*;
import
java.awt.*;
import
java.awt.event.*;
public
class
ControlCircle
extends
JFrame {
private
JButton
jbtEnlarge
=
new
JButton(
"Enlarge"
);
private
JButton
jbtShrink
=
new
JButton(
"Shrink"
);
private
CirclePanel
canvas
=
new
CirclePanel();
public
ControlCircle(){
JPanel panel =
new
JPanel();
panel.add(
jbtEnlarge
);
panel.add(
jbtShrink
);
this
.add(
canvas
,BorderLayout.
CENTER
);
this
.add(panel,BorderLayout.
SOUTH
);
jbtEnlarge
.addActionListener(
new
EnlargeListener());
}
public
static
void
main(String[] args){
JFrame frame =
new
ControlCircle();
frame.setTitle(
"ControlCircle"
);
frame.setLocationRelativeTo(
null
);
frame.setSize(200,200);
frame.setDefaultCloseOperation(JFrame.
EXIT_ON_CLOSE
);
frame.setVisible(
true
);
}
class
EnlargeListener
implements
ActionListener{
public
void
actionPerformed(ActionEvent e){
canvas
.enlarge();
}
}
class
CirclePanel
extends
JPanel{
private
int
radius
= 5;
public
void
enlarge(){
radius
++;
repaint();
}
protected
void
paintComponent(Graphics g){
super
.paintComponents(g);
g.drawOval(getWidth()/2 -
radius
,getHeight()/2 -
radius
, 2 *
radius
, 2 *
radius
);
}
}
}
内部类:
定义在另一个类范围内的类成为内部类。内部类可以像常规类一样使用。如果内部类只是被外部类使用,那就将该类定义为内部类。
内部类可以引用定义在它所嵌套的外部类中的数据和方法
内部类的对象经常在外部类中创建
内部类的应用就是将从属类合并到主类中,可以减少源文件数量,便于管理