zoukankan      html  css  js  c++  java
  • GUI图形界面编程之事件处理机制

    事件处理机制三要素:

    事件源:能够产生事件的组件

    事件:用户对组件的一个操作

    事件监听器:接收事件、解释事件并处理用户交互的方法处理事件源发生的事件

    事件处理机制:当组件(比如 Button)被点击时就会产生ActionEvent事件,事件被传递给一个 ActionListener 对象,再由ActionListener 定义的方法来响应处理事件(自动调用ActionEvent)

    当事件发生后,将某事件的对象传递给事件监听器(事件监听器实现了发生此事件所对应的接口),事件监听器会处理此事件,为了监视此事件,事件的处理方要先向发生方注册

    事件有很多种,监听事件所实现的接口也有很多种。监听哪件事,就必须实现此事件的接口。事件与监听事件的接口一 一对应

    按钮事件处理机制:

    按钮事件(ActionEvent):组件的特定动作(比如被按下)发生时,由组件(比如 Button)生成此高级别事件

    要使用键盘在 Button 上触发 ActionEvent,请使用空格键

    监听器接口:ActionListener

    一个监听器监听一个事件源对象

    import java.awt.BorderLayout;
    import java.awt.Button;
    import java.awt.Frame;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    
    
    
    /**
     *
     *程序功能:
     *时间:
     * @author Administrator
     */
    public class Test1 {
    
        /**
         * @param args
         */
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            //创建面板及按钮
            Frame f=new Frame();
            Button b=new Button();
            f.add(b,BorderLayout.NORTH);
            f.setVisible(true);
            f.setResizable(true);
            f.pack();
    
            //创建监听器
            Monitor bh=new Monitor();
            //事件注册:表示监听器bh监听对象b,当事件发生后,调用接口中的方法
            b.addActionListener(bh);
    
        }
    
    }
    
    class Monitor implements ActionListener{
        //当事件触发时执行此方法
        //当事件发生后,把此事件具体信息封装成对象传递给此函数的参数e
        public void actionPerformed(ActionEvent e){
            System.out.println("Press!!!
    ");
    
        }
    }

    1个监听器监听多个事件源对象

    import java.awt.BorderLayout;
    import java.awt.Button;
    import java.awt.Frame;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    
    
    
    /**
     *
     *程序功能:
     *时间:
     * @author Administrator
     */
    public class Test1 {
    
        /**
         * @param args
         */
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            //创建面板及按钮
            Frame f=new Frame();
            Button b1=new Button();
            Button b2=new Button();
            f.add(b1,BorderLayout.NORTH);
            f.add(b2,BorderLayout.CENTER);
            f.setVisible(true);
            f.setResizable(true);
            f.pack();
    
            //创建监听器
            Monitor bh=new Monitor();
            //事件注册:表示监听器bh监听对象b,当事件发生后,调用接口中的方法
            b1.addActionListener(bh);
            b2.addActionListener(bh);
            //重设提示
            b2.setActionCommand("Stop!!!");
        }
    
    }
    
    class Monitor implements ActionListener{
        //当事件触发时执行此方法
        //当事件发生后,把此事件具体信息封装成对象传递给此函数的参数e
        public void actionPerformed(ActionEvent e){
            System.out.println("Press!!!
    "+e.getActionCommand());
            
        }
    }

    TextField 对象可能发生Action(光标在文本框中敲回车)事件,与该事件对应的事件类是java.awt.event.ActionEvent. java.awt.event.ActionListener接口处理ActionEvent事件

    创建文本框并实现文本框输入显示到命令行中

    文本框输入内容不可见

    import java.awt.Frame;
    import java.awt.TextField;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    
    public class Test2 {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            new TextFieldDemo();
        }
    
    }
    class TestFieldDemo extends Frame {
    
        TestField tf=null;
        Monitor2 m=null;
        TestFieldDemo(){
    
            //创建面板
            tf=new TestField();
            this.add(tf);
            this.setVisible(true);
            this.pack();
    
            //设置此文本字段的回显字符(用于输入密码)
            tf.setEchoChar('*');
            //创建监听器
            m=new Monitor2();                                              
            //注册
            tf.addActionListener(m);
    
        }
    }
    
    
    class Monitor2 implements ActionListener{
        public void actionPerformed(ActionEvent e){
            TextField tf=(TextField)e.getSource();
            System.out.println(tf.getText());
            tf.setText("");
            
            
    
        }
    
    }

    内部类:可以方便的访问包装类的成员变量或成员方法。

        不允许或不需要被其他类访问

    import java.awt.Button;
    import java.awt.FlowLayout;
    import java.awt.Frame;
    import java.awt.Label;
    import java.awt.TextField;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    /**
     *
     *程序功能:实现一个加法运算。两个加数及结果数放在文本框中,通过按钮事件处理机制实现。
     *时间:2014-5-11
     *
     * @author Administrator
     */
    
    
    public class Test4 {
        public static void main(String[] args){
            new FrameDemo().LaunchFrame();
    
        }
    }
    
    
    class FrameDemo extends Frame{
        TextField t1=null;
        TextField t2=null;
        TextField t3=null;
    
        public void LaunchFrame(){
            //创建面板
            t1=new TextField(10);
            t2=new TextField(10);
            t3=new TextField(15);
            Label l=new Label("+");
            Button b=new Button("=");
    
            this.setLayout(new FlowLayout());
            this.add(t1);
            this.add(l);
            this.add(t2);
            this.add(b);
            this.add(t3);
            this.setResizable(true);
            this.pack();
            this.setVisible(true);
    
    
            //创建监控器及监控按钮事件
            b.addActionListener(new Monitor3());
    
        }
        //内部类  访问包装类的成员
    
        class Monitor3 implements ActionListener{
    
            int t11=0;
            int t22=0;
            
            public void actionPerformed(ActionEvent e){
    
                //取出t1,t2文本框中的内容
                try{
                    t11=Integer.parseInt(t1.getText());
                    t22=Integer.parseInt(t2.getText());
                }catch(NumberFormatException e2){
                    e2.printStackTrace();
                }
    
                //将t11与t22的和显示在t3文本框中
                t3.setText("" + (t11+t22));
    
            }
    
        }
    }

    Graphic类:用于窗口画图,相当于画笔。

    要想在哪个组件中画图,就在哪个组件中重写paint(Graphic g)方法。

    paint方法在需要重画的时候自动调用。比如显示窗口,窗口最大化,最小化等

    import java.awt.*;
    /**
     * 
     *
     *程序功能:在面板上显示图案
     *
     * @author Administrator
     */
    
    public class PaintDemo {
        public static void main(String[] args) {
            new PaintFrame().launchFrame();
        }
    }
    
    class PaintFrame extends Frame {
        
        public void launchFrame() {
            //创建面板
            setBounds(200,200,640,480);
            setVisible(true);
        }
        
        //使用paint方法画图
        public void paint(Graphics g) {
            //保存默认颜色
            Color c = g.getColor();
            g.setColor(Color.red);
            g.fillOval(50, 50, 30, 30);
            g.setColor(Color.green);
            g.fillRect(80,80,40,40);
            //恢复默认颜色
            g.setColor(c);
        }
        
    }

    鼠标事件处理机制:

    鼠标事件(MouseEvent):当且仅当动作发生时鼠标光标处于特定组件边界未被遮掩的部分上,才认为在该组件上发生了鼠标动作,生成此低级别事件

    监听器接口:MouseListener:鼠标事件

                     MouseMotionListener:鼠标移动事件

    对于以下动作,组件对象将生成此低级别事件:

    鼠标事件

    按下鼠标按键

    释放鼠标按键

    单击鼠标按键(按下并释放)

    鼠标光标进入组件几何形状的未遮掩部分

    鼠标光标离开组件几何形状的未遮掩部分

    鼠标移动事件

    移动鼠标

    拖动鼠标

    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    public class Test{
      public static void main(String args[]) {
        new MyFrame("drawing...");
      }
    }
    
    class MyFrame extends Frame {
      ArrayList points = null;
      MyFrame(String s) {
        super(s);
        points = new ArrayList(); 
        setLayout(null);
        setBounds(300,300,400,300); 
        this.setBackground(new Color(204,204,255));
        setVisible(true);
        this.addMouseListener(new Monitor());
        }
        
        public void paint(Graphics g) {
        Iterator i = points.iterator();
        while(i.hasNext()){
          Point p = (Point)i.next();
          g.setColor(Color.BLUE);
          g.fillOval(p.x,p.y,10,10);
        }
      }
      
      public void addPoint(Point p){
        points.add(p);
      }
    }
    
    class Monitor extends MouseAdapter {
      public void mousePressed(MouseEvent e) {
        MyFrame f = (MyFrame)e.getSource();
        f.addPoint(new Point(e.getX(),e.getY()));
        f.repaint();
      }
    }

    实现了监听器接口的类:MouseAdapter,MouseMotionAdapter

    创建的监听器一般不继承MouseListener,而是继承MouseAdapter。因为MouseListener接口有多于一个方法。但是实现后一般只使用一个方法。如果要实现接口,除了要使用的方法要重写外,其他不需要使用的方法也要重写成空方法,比较麻烦。而MouseAdapter已经把接口中的所有方法重写成空方法。如果继承MouseAdapter,只需要重写你需要的方法即可。

    window事件处理:

    window事件(WindowEvent):

    监听器接口:WindowListener

    实现了监听器接口的类:WindowAdapter

    实现关闭窗口

    import java.awt.*;
    import java.awt.event.*;
    public class Test2 {
        public static void main(String args[]) {
            new MyFrame55();
        }
    }
    class MyFrame55 extends Frame {
        MyFrame55() {
    
            setLayout(null);
            setBounds(300, 300, 400, 300);
            this.setBackground(Color.black);
            setVisible(true);
            
            this.addWindowListener(new MyWindowMonitor());
        }
    
        class MyWindowMonitor extends WindowAdapter {
            public void windowClosing(WindowEvent e) {
                setVisible(false);
                System.exit(0);
            }
        }
    
    }

    匿名类:

    方法里的逻辑简单、语句比较少、不经常变动时使用

    import java.awt.*;
    import java.awt.event.*;
    public class Test2 {
        public static void main(String args[]) {
            new MyFrame55();
        }
    }
    class MyFrame55 extends Frame {
        MyFrame55() {
    
            setLayout(null);
            setBounds(300, 300, 400, 300);
            this.setBackground(Color.black);
            setVisible(true);
    
    
            this.addWindowListener(
                    new WindowAdapter() {
                        public void windowClosing(WindowEvent e) {
                            setVisible(false);
                            System.exit(-1);
                        }
                    });
        }
    
    }

    键盘事件处理机制:

    键盘事件(KeyEvent):表示组件中发生键击的事件。当按下、释放或键入某个键时,组件对象(如文本字段)将生成此低级别事件。

    监听器接口:KeyListener

    实现了监听器接口的类:KeyAdapter

    当使用键盘上”向上箭头“键时,做出反应

    import java.awt.*;
    import java.awt.event.*;
    
    public class Test {
        public static void main(String[] args) {
            new KeyFrame().launchFrame();
        }
    }
    
    class KeyFrame extends Frame {
        public void launchFrame() {
            setSize(200, 200);
            setLocation(300,300);
            addKeyListener(new MyKeyMonitor());
            setVisible(true);
        }
    
        class MyKeyMonitor extends KeyAdapter {
            public void keyPressed(KeyEvent e) {
                int keyCode = e.getKeyCode();
                if(keyCode == KeyEvent.VK_UP) {
                    System.out.println("UP");
                }
            }
        }
    
    
    
        class Monitor2 extends WindowAdapter{
            public void windowClosing(WindowEvent e){
                setVisible(true);
                System.exit(0);
    
            }
    
    
        }
    }
  • 相关阅读:
    CF1552 D. Array Differentiation
    CF1542 B. Plus and Multiply
    CF1543 D1. RPD and Rap Sheet (Easy Version)
    CF1555 E. Boring Segments(线段树+双指针)
    CF1513 D. GCD and MST
    hdu 6194 string string string
    CF1527 B2. Palindrome Game (hard version)
    DDD领域驱动设计落地实践(十分钟看完,半小时落地)
    【5分钟】W10 64bit系统本地安装postgresql 11
    程序员如何成为架构师
  • 原文地址:https://www.cnblogs.com/shangshicc/p/3726117.html
Copyright © 2011-2022 走看看