Java Gui 事件监听

事件监听

  • 当某个事情发生的时候,干什么?

    package com.xiao.lessson02;
    
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    public class TestActionEvent {
        public static void main(String[] args) {
                //按下按钮,触发一些事件
            Frame frame = new Frame();
            Button button = new Button();
    
            //因为,addActionListener()需要一个ActionListener,所以我们需要构造一个ActionListener
    
            MyActionListener myActionListener = new MyActionListener();
    
            frame.add(button,BorderLayout.CENTER);
            frame.pack();
            windowClose(frame);
            frame.setVisible(true);
        }
        private static void windowClose(Frame frame){
            frame.addWindowListener((new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            }));
        }
    
       static class  MyActionListener implements ActionListener{
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("aaa");
            }
        }
    }
    
    
  • 多个按钮共享一个事件

package com.xiao.lessson02;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TestActionTwo {




    public static void main(String[] args) {
        //两个按钮,实现同一个监听
        //开始   停止
        Frame frame = new Frame("开始-停止");
        Button button1 = new Button("start");
        Button button2 = new Button("stop");

        //可以显示的定义触发会返回的命令,如果不显示定义,则会走默认的值!
        //可以多个按钮只写一个监听类
        button2.setActionCommand("button2-stop");

        MyMonitor myMonitor = new MyMonitor();

        button1.addActionListener(myMonitor);
        button2.addActionListener(myMonitor);

        frame.add(button1,BorderLayout.NORTH);
        frame.add(button2,BorderLayout.SOUTH);

        frame.pack();
        frame.setVisible(true);
    }


}




class MyMonitor implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        //e.getActionCommand() 获得按钮的信息
        System.out.println("按钮被点击了:msg"+e.getActionCommand());
    }
}

Java GUI 事件监听

Java-GUI事件监听机制

package com.xiao.lesson03;

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;

//鼠标监听事件
public class TestMouseListener {
    public static void main(String[] args) {
        new MyFrame("画图");
    }
}
//自己的类
class MyFrame extends Frame{
    //画画需要画笔,需要监听鼠标当前的位置,需要集合来存储这个点
    ArrayList points;

    public MyFrame(String title){
        super(title);
        setBounds(200,200,400,300);
        points = new ArrayList<>();



        setVisible(true);
        //鼠标监听器,正对这个窗口
        this.addMouseListener(new MyMouseListener());


    }

    @Override
    public void paint(Graphics g) {
        //画画,监听鼠标的事件
        Iterator integer = points.iterator();
        while (integer.hasNext()){
            Point point = (Point) integer.next();
            g.setColor(Color.BLUE);
            g.fillOval(point.x,point.y,10,10);
        }
    }
    //添加一个点到界面上
    public void addPaint(Point point){
        points.add(point);
    }
    //适配器模式
    private class MyMouseListener extends MouseAdapter{
        //鼠标 按下,弹起,

        @Override
        public void mousePressed(MouseEvent e) {
            MyFrame frame = (MyFrame) e.getSource();
            //这个我们点击的时候,就会在界面上产生一个点!画
            //这个点就是鼠标的点
            frame.addPaint(new Point(e.getX(),e.getY()));

            //每次点击鼠标都需要重新画一遍
            frame.repaint();//刷新

        }
    }
}

窗口监听

package com.xiao.lesson03;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class TestWindow {
    public static void main(String[] args) {
        new WindowFrame();

    }
}
class WindowFrame extends Frame{
    public WindowFrame(){
        setBackground(Color.BLUE);
        setBounds(100,100,200,200);
        setVisible(true);
        //addWindowListener(new MyWindowListener());
        //匿名内部类
        new WindowAdapter(){
            @Override
            public void windowClosing(WindowEvent e) {
                System.out.println("你点击了送完");
                System.exit(0);
            }
        };
    }
//    class MyWindowListener extends WindowAdapter{
//        @Override
//        public void windowClosing(WindowEvent e) {
//            setVisible(false); //隐藏窗口,
//            System.exit(0);  //正常退出
//        }
//    }
}

简易计算器,组合+内部类回顾复习!

oop原则:组合,大于继承

未做优化

class A extends B{
    
}
class A{
    public B b;
}

    //3  个文本框
        TextField num1 = new TextField(10);
        TextField num2 = new TextField(10);
        TextField num3 = new TextField(10);

        //1 个按钮
        Button button = new Button("=");

        //1个标签
        Label label = new Label("+");

        //布局
        setLayout(new FlowLayout());

        add(num1);
        add(label);
        add(num2);
        add(button);

修改后的面向对象

package com.xiao.lessson02;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TestCalc {
    public static void main(String[] args) {
       new Calculator().loadFrame();


    }


}
//计算器类
class Calculator extends Frame {
    //属性
    TextField num1, num2, num3;

    //方法
    public void loadFrame() {
        //3  个文本框
        num1 = new TextField(10);
        num2 = new TextField(10);
        num3 = new TextField(10);
        Label label = new Label("+");
        Button button = new Button("=");


        button.addActionListener(new MyCalculatorListener(this));

        //布局
        setLayout(new FlowLayout());
        add(num1);
        add(label);
        add(num2);
        add(button);
        add(num3);

        pack();
        setVisible(true);

    }
}
//监听器类
class MyCalculatorListener implements ActionListener{

    //获取计算器这个对象,在一个类中组合另外一个类;
   Calculator calculator = null;

    public MyCalculatorListener(Calculator calculator) {
       this.calculator = calculator;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //获得加数和被加数
        //将这个值 + 法运算后,放到第三个框
        // 清除前两个框

        int n1 = Integer.parseInt(calculator.num1.getText());
        int n2 = Integer.parseInt(calculator.num2.getText());
        calculator.num3.setText(""+(n1+n2));
        calculator.num1.setText("");
        calculator.num2.setText("");

    }
}

内部类

更好的包装

package com.xiao.lessson02;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TestCalc {
    public static void main(String[] args) {
       new Calculator().loadFrame();


    }


}
//计算器类
class Calculator extends Frame {
    //属性
    TextField num1, num2, num3;

    //方法
    public void loadFrame() {
        //3  个文本框
        num1 = new TextField(10);
        num2 = new TextField(10);
        num3 = new TextField(10);
        Label label = new Label("+");
        Button button = new Button("=");


        button.addActionListener(new MyCalculatorListener());

        //布局
        setLayout(new FlowLayout());
        add(num1);
        add(label);
        add(num2);
        add(button);
        add(num3);

        pack();
        setVisible(true);

    }

    //监听器类
    //内部类最大的好处,就是可以畅通无阻的访问外部的属性和方法!
    private class MyCalculatorListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            //获得加数和被加数
            //将这个值 + 法运算后,放到第三个框
            // 清除前两个框
            int n1 = Integer.parseInt(num1.getText());
            int n2 = Integer.parseInt(num2.getText());
            num3.setText("" + (n1 + n2));
            num1.setText("");
            num2.setText("");

        }
    }
}

posted @ 2021-03-02 08:56  岁月-伤  阅读(101)  评论(0)    收藏  举报