Java高级-GUI之AWT事件处理
AWT事件的处理过程中,主要涉及3类对象:
Event(事件):用户对组件的一个操作,称之为一个事件,以类的形式出现,例如键盘操作对应的事件类是KeyEvent。事件实例在该事件发生时由系统自动产生。每一种事件都对应专门的监听者。
Event Source(事件源):事件发生的场所,通常就是各个组件本身,例如按钮Button。
Event Monitor(事件监听器):接收事件对象并对其进行处理的类对象,通常其中某个成员方法对事件进行相应的处理。
事件:AWT的相关事件继承于java.awt.AWTEvent类,这些事件分为两大类:
低级事件:基于组件和容器的事件,当一个组件发生事件,如鼠标进入、点击、拖放或组件窗口开关时触发的组件事件。比如:
ComponentEvent(组件事件:组件尺寸变化、移动)
ContainerEvent(容器事件:组件增加、移动)
WindowEvent(窗口事件:关闭窗口、窗口闭合、图标化)
FocusEvent(焦点事件)
KeyEvent(键盘事件)
MouseEvent(鼠标事件:鼠标单击、移动)
高级事件:基于语义的事件,它可以不和特定的动作相关联,而依赖于触发此事件的类。比如,在TextField中按Enter键会触发ActionEvent事件,滑动滚动条会触发AdjustmentEvent事件,选中项目列表的某一条就会触发ItemEvent事件。高级事件如:
ActionEvent(动作事件:按钮按下)
AdjustmentEvent(调节事件)
ItemEvent(项目事件:选中、反选时发生)
TextEvent(文本事件:文本对象改变)
事件监听器
事件监听器通常是一个类,该类必须实现与该事件类型相对应的接口。对应的接口被称为事件监听器接口。事件监听器接口类的名称与事件类的名称相对应,例如,MouseEvent事件类对应的监听器接口名为MouseListener。监听器接口如:
ActionListener
ItemListener
MouseMotionListener
MouseListener
KeyListener
FocusListener
AdjustmentListener
ComponentListener
WindowListener
ContainerListener
TextListener
事件适配器类
Java语言为一些事件监听器接口提供了适配器类(Adapter)。我们可以通过继承事件所对应的Adapter类,重写所需要的方法,无关的方法则不用实现。事件适配器为我们提供了一种简单的实现监听的手段,可以缩短程序代码。
java.awt.event包中定义的事件适配器类包括以下7个:
MouseAdapter
MouseMotionAdapter
KeyAdapter
WindowAdapter
ComponentAdapter
ContainerAdapter
FocusAdapter
demo:
package pkg1.awt; import java.awt.BorderLayout; import java.awt.Button; import java.awt.CardLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.Label; import java.awt.Panel; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionAdapter; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class ListenerDemo { public static void main(String[] args) { MyFrameLis frame = new MyFrameLis("事件监听器"); frame.init(); } } class MyFrameLis extends Frame { private Panel card_panel = null;// 卡片面板(放卡片布局管理器) private Panel ctl_panel = null;// 控件面板(放流式布局管理器) private CardLayout cardLayout = null;// 卡片布局管理器 private FlowLayout flowLayout = null;// 流式布局管理器 private Label lb1, lb2, lb3, lb4; private TextField txt = null; private Button btn_first, btn_pre, btn_next, btn_last; private boolean isRegisted = false; public MyFrameLis(String title) { super(title); // 初始化 init(); // 按钮添加事件监听器 registerListener(); } public void init() { card_panel = new Panel(); ctl_panel = new Panel(); cardLayout = new CardLayout(); flowLayout = new FlowLayout(); card_panel.setLayout(cardLayout); ctl_panel.setLayout(flowLayout); // Frame默认为BorderLayout布局,把两个Panel放在Frame中,一个上一个下 this.add(card_panel, BorderLayout.CENTER); this.add(ctl_panel, BorderLayout.SOUTH); // 卡片布局管理器放组件 // Label、TextField 创建控件 lb1 = new Label("Content1", Label.CENTER); lb2 = new Label("Content2", Label.CENTER); txt = new TextField("Content3");// 文本框 lb3 = new Label("Content4", Label.CENTER); lb4 = new Label("Content5", Label.CENTER); // 控件添加到容器,默认显示其中第一个卡片 card_panel.add("l" + (card_panel.getComponentCount() + 1), lb1); card_panel.add("l" + (card_panel.getComponentCount() + 1), lb2); card_panel.add("l" + (card_panel.getComponentCount() + 1), txt); card_panel.add("l" + (card_panel.getComponentCount() + 1), lb3); card_panel.add("l" + (card_panel.getComponentCount() + 1), lb4); // 创建按钮对象 btn_first = new Button("first"); btn_pre = new Button("pre"); btn_next = new Button("next"); btn_last = new Button("last"); ctl_panel.add(btn_first); ctl_panel.add(btn_pre); ctl_panel.add(btn_next); ctl_panel.add(btn_last); ctl_panel.setBackground(Color.GRAY); this.setSize(400, 300); this.setLocation(800, 500); this.setVisible(true); card_panel.setVisible(true); ctl_panel.setVisible(true); } private void registerListener() { if (!isRegisted) { BtnListener btnListener = new BtnListener(); btn_first.addActionListener(btnListener); btn_pre.addActionListener(btnListener); btn_next.addActionListener(btnListener); btn_last.addActionListener(btnListener); /* 注册鼠标移动事件 lb1.addMouseMotionListener(new MouseMotionAdapter(){ @Override public void mouseMoved(MouseEvent e) { String mytxt=e.getX()+":"+e.getY(); //lb1.setText(mytxt); System.out.println(mytxt); super.mouseMoved(e); } });*/ //注册鼠标点击事件 lb1.addMouseListener(new MouseAdapter(){ @Override public void mouseClicked(MouseEvent e) { String mytxt="鼠标点击"; //lb1.setText(mytxt); System.out.println(mytxt); super.mouseClicked(e); } @Override public void mouseExited(MouseEvent e) { System.out.println("鼠标移出"); super.mouseExited(e); } }); //关闭窗口事件,之前没写监听事件默认是关不了的。 this.addWindowListener(new WindowAdapter(){ @Override public void windowClosing(WindowEvent e) { System.out.println("窗口关闭"); System.exit(0); //super.windowClosing(e); } }); isRegisted = true; } } // 按钮事件类,可以作为成员内部类 class BtnListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { // System.out.println(e.getActionCommand()); // System.out.println(e.getSource()); Button btn = (Button) e.getSource(); String btnText = btn.getLabel(); System.out.println(btnText); switch (btnText) { case "first": cardLayout.first(card_panel); break; case "pre": cardLayout.previous(card_panel); break; case "next": cardLayout.next(card_panel); break; case "last": // cardLayout.show(card_panel,"l5"); cardLayout.last(card_panel); break; } } } }
效果: