1.事件模型
在整个事件触发和相应的过程中,主要涉及一下3类对象
(1) 事件源 : 引起时间的GUI对象,如各类组件(Button,Label,TextField),容器组件(Frame,panel,ScrallPane等)
(2) 事件类 : 事件类是引发的GUI时间封装成的类,如鼠标事件 MouseEvent
(3) 事件处理器 : 接收事件类
1.1 事件类
低级事件
ComponentEvent( 组件事件:组件尺寸的变化,移动)
ContainerEvent( 容器事件:组件增加,移动)
WindowEvent( 窗口事件:关闭窗口,窗口闭合,图标化)
FocusEvent( 焦点事件:焦点的获得和丢失)
KeyEvent( 键盘事件:键按下、释放)
MouseEvent( 鼠标事件:鼠标单击,移动)
高级事件(语义事件)
ActionEvent(动作事件:按钮按下,TextField中按Enter键)
AdjustmentEvent(调节事件:在滚动条上移动滑块以调节数值)
ItemEvent(项目事件:选择项目,不选择"项目改变")
TextEvent(文本事件,文本对象改变)
1.2 事件处理器
处理组件触发事件的方法成为“事件处理器”,事件处理器必须实现事件监听接口才能接收对应的事件类,每类事件都用对应的事件监听接口实现接口的事件处理器来接收对应的事件类。
1.3注册事件处理器
在组件中注册该组件将引发时间类对应的事件处理器,如按钮的单击事件可以用行为事件类(ActionEvent)来封装,也可用MouseEvent。在按钮组件中注册该ActionEvent事件的处理器,使用addActionListener方法:
Button a = new Button("a");
a.addActionListener(new actionHandler());
常用事件处理器注册方法:
(1)addActionListener(), 可用于Button以及TextField等具有行为操作的组件
(2)addAdjustmentListener() 可用于ScrollBar等具有滚动操作的组件
(3)addFocusListener() 可用于具有焦点操作的组件
(4)addItemListener() 可用于CheckBox ComboBox等具有项选择操作的组件
(5)addKeyListener() 可用于具有键盘输入操作的组件
(6)addMouseListener() 可用于具有鼠标操作的组件
(7)addWindowListener() 可用于窗体操作的组件
2.事件处理器
所有AWT事件及其相应的监听器接口,一共10类事件,11个接口
事件类别 | 描述信息 | 接口名 | 方法 |
ActionEvent | 激活组件 | ActionListener | actionPerformed(ActionEvent) |
ItemEvent | 选择了某些项目 | ItemListener | itemStateChanged(ItemEvent) |
MouseEvent | 鼠标移动 | MouseMotionListener | mouseDragged(MouseEvent) mouseMoved(MouseEvent) |
鼠标点击等 | MouseListener | mousePressed(MouseEvent) mouseReleased(MouseEvent) mouseEntered(MouseEvent) mouseExited(MouseEvent) mouseClicked(MouseEvent) | |
KeyEvent | 键盘输入 | KeyListener | keyPressed(KeyEvent) keyReleased(KeyEvent) keyTyped(KeyEvent) |
FocusEvent | 组件收到或失去焦点 | FocusListener | focusGained(FocusEvent) focusLost(FocusEvent) |
AdjustmentEvent | 移动了滚动条等组件 | AdjustmentListener | adjustmentValueChanged(AdjustmentEvent) |
ComponentEvent | 对象移动缩放显示隐藏等 | ComponentListener | componentMoved(ComponentEvent) componentHidden(ComponentEvent) componentResized(ComponentEvent) componentShown(ComponentEvent) |
WindowEvent | 窗口收到窗口级事件 | WindowListener | windowClosing(WindowEvent) windowOpened(WindowEvent) windowIconified(WindowEvent) windowDeiconified(WindowEvent) windowClosed(WindowEvent) windowActivated(WindowEvent) windowDeactivated(WindowEvent) |
ContainerEvent | 容器中增加删除了组件 | ContainerListener | componentAdded(ContainerEvent) componentRemoved(ContainerEvent) |
TextEvent | 文本字段或文本区发生改变 | TextListener | textValueChanged(TextEvent) |
一些例子:
eg 1 点击确定按钮弹出新窗口
public class ClickEvent {
public static void main(String[] args) {
Frame frame = new Frame("Frame 窗体");
frame.setLayout(new GridLayout(1,2));
Button b1 = new Button("确定");
Button b2 = new Button("取消");
frame.add(b1);
frame.add(b2);
frame.pack();//窗口设置为最佳大小
b1.addActionListener(new MyClickListener());
b2.addActionListener(new MyClickListener());
frame.setVisible(true);
}
}
class MyClickListener implements ActionListener{
public void actionPerformed(ActionEvent e){
if(e.getActionCommand().equals("确定")){
Frame newWindow = new Frame("新窗口");
newWindow.setSize(100,100);
newWindow.setVisible(true);
}else{
System.exit(0);
}
}
}
eg 2 拖动鼠标在控制台显示鼠标轨迹坐标,点击鼠标左键在控制台显示点击坐标
public class EventListener {
EventListener(){
Frame frame = new Frame("Frame 窗体");
frame.setSize(200,200);
frame.addMouseListener(new MyMouseListener());
frame.addMouseMotionListener(new MouseMotionListener(){
public void mouseDragged(MouseEvent e){
System.out.println("拖动鼠标,当前位置:"+e.getX()+","+e.getY());
}
public void mouseMoved(MouseEvent e){
}
});
frame.setVisible(true);
}
public static void main(String[] args) {
/*Frame frame = new Frame("Frame 窗体");
frame.setSize(200,200);
frame.addMouseListener(new MyMouseListener());
frame.setVisible(true);*/
new EventListener();
}
}
//用接口有一个缺点:所有方法必须实现
class MyMouseListener implements MouseListener{
public void mouseClicked(MouseEvent e){
System.out.println("鼠标当前位置:"+e.getX()+","+e.getY());
}
public void mousePressed(MouseEvent e){
}
public void mouseReleased(MouseEvent e){
}
public void mouseExited(MouseEvent e){
}
public void mouseEntered(MouseEvent arg0) {
}
}
eg 3 在文本框显示按下的键盘键
public class KeyAdapterCls {
public static void main(String[] args) {
Frame frame = new Frame("Frame窗体");
frame.setLayout(new GridLayout(2,1));
Button btn = new Button("请按下键盘");
final TextField txt;
txt = new TextField();
btn.addKeyListener(new KeyListener(){
public void keyPressed(KeyEvent e){
txt.setText(txt.getText() + e.getKeyChar());
}
public void keyReleased(KeyEvent e){}
public void keyTyped(KeyEvent e){}
});
frame.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
frame.add(btn);
frame.add(txt);
frame.setSize(400,200);
frame.setVisible(true);
}
}