AWT事件处理机制

本文介绍了JavaAWT中的事件处理机制,包括事件源、事件、事件监听器和注册监听的概念。通过实例展示了如何使用ActionListener、ContainerListener和WindowListener来响应组件操作,如按钮点击、组件添加和窗口关闭事件。
摘要由CSDN通过智能技术生成

5 事件处理 

        前面介绍了如何放置各种组件,从而得到了丰富多彩的图形界面,但这些界面不能响应用户的任何操作,比如单击前面所有窗口右上角的“X”按钮,但窗口并不会关闭,因为在AWT编程中,所有用户的操作,都必须要经过一套事件处理机制来完成,而Frame和组件本身没有事件处理能力。

5.1 GUI事件处理机制

        定义:当在某个组件上发生某些操作的时候,会自动的触发一段代码的执行。

在GUI事件处理机制中,需要我们理解以下4个重要概念:

        事件源(Event Source):操作发生的场所,通常指某个组件,例如按钮,窗口等;

        事件(Event):在事件源上发生的操作可以叫事件,GUI会把事件都封装到一个Event对象中,如果需要知道该事件的详细信息,就可以通过Event对象来获取;

        事件监听器(Event Listener):当在某个事件源上发生了某个事件,事件监听器就可以对这个事件进行处理;

        注册监听:把某个事件监听器(A)通过某个事件(B)绑定到某个事件源(C)上,当在事件源C上发生了事件B之后,那么事件监听器A的代码就会自动执行。

        其流程图如下:

 下面举一个具体的例子:

         使用步骤:

        1.创建事件源组件对象;

        2.自定义类,实现XxxListener接口,重写方法;

        3.创建事件监听器对象(自定义类对象)

        4.调用事件源组件对象的addXxxListener方法完成注册监听

案例演示:

完成下图效果,点击确定按钮,在单行文本域内显示hello world;

 代码如下:


   
   
  1. public class EventDemo 1 {
  2. Frame frame = new Frame( "这里测试事件处理");
  3. TextField tf = new TextField( 30);
  4. / /事件源
  5. Button ok = new Button( "确定");
  6. public void init(){ / /组装视图
  7. / /监听器
  8. / /MyListener myListener = new MyListener();
  9. / /ok.addActionListener(myListener);
  10. / *private class MyListener implements ActionListener{
  11. @ Override
  12. public void actionPerformed(ActionEvent e) {
  13. tf.setText( "Hello World");
  14. }
  15. } * /
  16. / /注册监听
  17. ok.addActionListener(new ActionListener() {
  18. @ Override
  19. public void actionPerformed(ActionEvent e) {
  20. System.out.println( "ok按钮被点击了...");
  21. tf.setText( "Hello World");
  22. }
  23. });
  24. / /把tf和ok放入到Frame中
  25. frame. add(tf,BorderLayout.NORTH);
  26. frame. add(ok);
  27. frame.pack();
  28. frame.setVisible( true);
  29. }
  30. public static void main( String[] args) {
  31. new EventDemo 1().init();
  32. }
  33. }

5.2 GUI中常见事件和事件监听器

        事件监听器必须实现事件监听接口,AWT提供了大量的事件监听器接口用于实现不同类型的事件监听器,用于监听不同类型的事件。AWT中提供了丰富的事件类,用于封装不同组件上所发生的特定操作,AWT的事件类都是AWTEvent类的子类,AWTEvent是EventObject的子类。

5.2.1 事件

        AWT把事件分为了两大类:

        1.低级事件:这类事件是基于某个特定动作的事件。比如进入、点击、拖放等动作的鼠标事件,再比如得到焦点和失去焦点等焦点事件。

事件触发时机
ComponentEvent组件事件,当组件尺寸发生变化,位置发生移动,显示/隐藏状态发生改变时触发该事件
ContainerEvent容器事件,当容器里发生添加组件,删除组件时触发该事件
WindowEvent窗口事件,当窗口状态发生改变(如打开,关闭,最大化,最小化)时触发事件
FocusEvent焦点事件,当组件得到焦点或者失去焦点时触发该事件
KeyEvent键盘事件,当按键被按下,松开,单击时触发该事件
MouseEvent鼠标事件,当进行单击,按下,松开,鼠标移动等动作时触发该事件
PaintEvent组件绘制事件,该事件是一个特殊的事件类型,当GUI组件调用update/paint方法来呈现自身时触发该事件,该事件并非专用于事件处理模型

        2.高级事件:这类事件并不会基于某个特定动作,而是根据功能含义定义的事件。

事件触发时机
ActionEvent动作时间,当按钮,菜单项被单击,在TextField中按Enter键触发
AjustmentEvent调节事件,在滑动条上移动滑块以调节数值时触发该事件
ItemEvent选项事件,当用户选中某项,或取消某项时触发该事件
TextEvent文本事件,当文本框,文本域里的文本发生改变时触发该事件
5.2.2 事件监听器

        不同的事件需要使用不同的监听器监听,不同的监听器需要实现不同的监听器接口,当指定事件发生后,事件监听器就会调用所包含的事件处理器(实例方法)来处理事件。

事件类别描述信息监听器接口名
ActionEvent激活组件ActionListener
ItemEvent选择了某些项目ItemListener
MouseEvent鼠标移动MouseMotionListener
MouseEvent鼠标点击等MouseListener
KeyEvent键盘输入KeyListener
FocusEvent组件收到或者失去焦点FocusListener
AdjustmentEvent移动了滚动条等组件AdjustmentListener
ComponentEvent对象移动缩放显示隐藏等ComponentListener
WindowEvent窗口收到窗口级事件WindowListener
ContainerEvent容器中增加删除了组件ContainerListener
TextEvent文本字段或文本区发生改变TextListener

下面进行案例演示:

案例1:通过ContainerListener监听Frame容器添加组件;

             通过TextListener监听TextFiled内容变化;

             通过ItemListener监听Choice条目选中状态变化。

 演示代码:


   
   
  1. public class ListenerDemo1 {
  2. public static void main( String[] args) {
  3. Frame frame = new Frame( "这里测试监听器");
  4. //创建组件(事件源)
  5. TextField tf = new TextField( 30);
  6. Choice names = new Choice();
  7. names. add( "Java");
  8. names. add( "C++");
  9. names. add( "python");
  10. //给文本域添加TextListener,监听内容的变化
  11. tf. addTextListener( new TextListener() {
  12. @Override
  13. public void textValueChanged( TextEvent e) {
  14. String text = tf. getText();
  15. System. out. println( "当前文本框中的内容为:"+text);
  16. }
  17. });
  18. //给下拉选择框添加ItemListener,监听条目选项的变化
  19. names. addItemListener( new ItemListener() {
  20. @Override
  21. public void itemStateChanged( ItemEvent e) {
  22. Object item = e. getItem();
  23. System. out. println( "当前选中的条目为:"+item);
  24. }
  25. });
  26. //给frame注册ContainerListener监听器,监听容器中组件的添加
  27. frame. addContainerListener( new ContainerListener() {
  28. @Override
  29. public void componentAdded( ContainerEvent e) {
  30. Component child = e. getChild();
  31. System. out. println( "frame中添加了:"+child);
  32. }
  33. @Override
  34. public void componentRemoved( ContainerEvent e) {
  35. }
  36. });
  37. //添加到frame中
  38. Box hBox = Box. createHorizontalBox();
  39. hBox. add(names);
  40. hBox. add(tf);
  41. frame. add(hBox);
  42. //设置frame最佳大小并可见
  43. frame. pack();
  44. frame. setVisible( true);
  45. }
  46. }

案例2:

        给Frame设置WindowListener,监听用户点击X的动作,如果用户点击X,则关闭当前窗口

代码演示:


   
   
  1. public class ListenerDemo2 {
  2. public static void main( String[] args) {
  3. Frame frame = new Frame( "这里测试WindowListener");
  4. frame. setBounds( 200, 200, 500, 300);
  5. //设置WindowListener,监听用户点击X的动作,如果点击X,则关闭窗口
  6. frame. addWindowListener( new WindowAdapter() {
  7. @Override
  8. public void windowClosing( WindowEvent e) {
  9. //停止当前程序
  10. System. exit( 0);
  11. }
  12. });
  13. frame. setVisible( true);
  14. }
  15. }
  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java AWT(Abstract Window Toolkit)提供了一套GUI组件,它们可以用来创建用户界面。在AWT中,事件处理的核心是事件机制,其基本的原理是事件源生成一个事件对象,并将此事件对象传递给事件监听器进行处理。AWT事件机制包括事件源、事件对象、事件监听器和事件处理器四个部分。其中,事件源指用户操作的组件,如按钮、文本框等;事件对象则是被传递的事件;事件监听器则是对事件的响应处理;而事件处理器则是负责实现特定事件处理的方法。具体来说,当一个组件被触发时,它就会产生相应的事件,并将该事件传递给监听器进行处理。 在AWT中,布局管理器用于控制组件在容器中的位置和大小。常见的布局管理器有FlowLayout、BorderLayout、GridLayout和CardLayout等。下面是一个使用BorderLayout布局管理器的AWT程序示例代码: ``` import java.awt.*; public class AWTExample extends Frame { private Button btn1, btn2, btn3, btn4, btn5; public AWTExample() { setLayout(new BorderLayout()); btn1 = new Button("Button 1"); btn2 = new Button("Button 2"); btn3 = new Button("Button 3"); btn4 = new Button("Button 4"); btn5 = new Button("Button 5"); add(btn1, BorderLayout.NORTH); add(btn2, BorderLayout.SOUTH); add(btn3, BorderLayout.EAST); add(btn4, BorderLayout.WEST); add(btn5, BorderLayout.CENTER); setSize(300, 300); setVisible(true); } public static void main(String[] args) { new AWTExample(); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值