GUI编程03-事件监听

事件监听是指当某个事件发生的时候干一些什么。

例如之前在关闭frame窗口时就写过一个window窗口监听,当点击左上角❌时调用System.exit进行程序关闭。

1.按钮监听

下面的例子是监听按钮Button被点击时触发的事件

同时我们将窗口关闭监听事件进行了优化,将windowCloseing写为一个方法,在使用时直接调用不用再进行方法的重写。

复制代码
package YMP.GUI;
​
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("Button");
​
        //通过addActionListener()给button添加监听
        //addActionListener需要ActionListener接口,所以构造一个ActionListener
​
        //button添加监听,当button被点击时调用MyActionListener()
        button.addActionListener(new MyActionListener());
        
        frame.add(button,BorderLayout.CENTER);
​
        frame.setSize(200,200);
        frame.setVisible(true);
​
        //调用windowClose方法关闭窗口
        windoeClose(frame);
    }
    //关闭窗口事件
    private static void windoeClose(Frame frame){
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}
​
class MyActionListener implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("aaa");//当监听到行为时的事件:输出aaa
    }
}

2.两个按钮共用一个监听

复制代码
package YMP.GUI.ActionListener;
​
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 TestActionListener2 {
    public static void main(String[] args) {
        Frame frame=new Frame();
        Button button1=new Button("Start" );
        Button button2=new Button("Stop" );
​
        button1.addActionListener(new MyMonitor());
        button2.addActionListener(new MyMonitor());
​
        button2.setActionCommand("bton2-stop");//这里设置了ActionCommand
​
        frame.add(button1,BorderLayout.NORTH);
        frame.add(button2,BorderLayout.SOUTH);
​
        frame.setSize(200,200);
        frame.setVisible(true);
        windowClose(frame);
​
    }
    private static void windowClose(Frame frame){
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}
class MyMonitor implements ActionListener{
​
    @Override
    public void actionPerformed(ActionEvent e) {
        //e.getActionCommand(); 获得按钮信息ActionCommand,若不加修改则默认为按钮label
        System.out.println(e.getActionCommand());
        //这里在控制台输出了Command
​
        //通过if语句判断两个按钮,使得两个按钮共用一个监听
        if(e.getActionCommand().equals("Start")){
            System.out.println("Start按钮");
        }
        if(e.getActionCommand().equals("bton2-stop")){
            System.out.println("Stop按钮");
        }
    }
}

3.输入框监听事件(TextField)

复制代码
package YMP.GUI.ActionListener;
​
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 TestTextField {
    public static void main(String[] args) {
        new MyFrame();
        windowClose(new MyFrame());
    }
    private static void windowClose(Frame frame){
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
​
}
​
class MyFrame extends Frame {
    public MyFrame() {
        TextField textField = new TextField();//创建文本框对象
        add(textField);
​
        textField.addActionListener(new MyTextActionListener());
​
        setSize(500, 80);
        setVisible(true);
​
        //设置置换编码
        // textField.setEchoChar('*');
    }
}
​
    class MyTextActionListener implements ActionListener {
​
​
        @Override
        public void actionPerformed(ActionEvent e) {
            TextField field = (TextField) e.getSource();//获得资源,返回对象
            System.out.println(field.getText());//输出文本框内容
            field.setText("");//设置回车后文本框清空
        }
    }
​
​

4.简易计算器

制作以下图片所示简易计算器

过程设计

1.图示计算器是由3个text field,一个label和一个button组合

2.第一,二个文本框用于接收用户输入信息,button按下在第三个文本框输出结果

代码实现

复制代码
![屏幕截图 2024-06-12 203920](C:\Users\youmu\Pictures\Screenshots\屏幕截图 2024-06-12 203920.png)package YMP.GUI.ActionListener;
​
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 TestCalc {
    public static void main(String[] args) {
        new Calculator();
    }
}
class Calculator extends Frame{
    public Calculator(){
        TextField T1=new TextField(10);//columns 可输入最大个数
        TextField T2=new TextField(10);
        TextField T3=new TextField(20);
​
        Button button=new Button("=");
        Label label=new Label("+");
​
        setLayout(new FlowLayout());
        add(T1);
        add(label);
        add(T2);
        add(button);
        add(T3);
​
        pack();
        setVisible(true);
​
        button.addActionListener(new MyCalculatorListenner(T1,T2,T3));
​
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}
class MyCalculatorListenner implements ActionListener{
    private TextField T1,T2,T3;
    public MyCalculatorListenner(TextField T1,TextField T2,TextField T3){
        this.T1=T1;
        this.T2=T2;
        this.T3=T3;
​
    }
​
    @Override
    public void actionPerformed(ActionEvent e) {
        int n1=Integer.parseInt(T1.getText());
        int n2=Integer.parseInt(T2.getText());
        T3.setText(""+(n1+n2));
        T1.setText("");
        T2.setText("");
    }
}

代码优化,完全面向对象

既然我们使用的是java,就该运用java的特长面向对象

复制代码
package YMP.GUI.ActionListener;
​
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 TestCalc {
    public static void main(String[] args) {
        new Calculator().loadFrame();
    }
}
class Calculator extends Frame{
    //属性
    TextField T1,T2,T3;
​
    //方法
    public void loadFrame(){
         T1=new TextField(10);//columns 可输入最大个数
         T2=new TextField(10);
         T3=new TextField(20);
​
        Button button=new Button("=");
        Label label=new Label("+");
​
        setLayout(new FlowLayout());
        add(T1);
        add(label);
        add(T2);
        add(button);
        add(T3);
​
        pack();
        setVisible(true);
​
        button.addActionListener(new MyCalculatorListenner(this));
​
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
​
    }
    public Calculator(){
​
    }
}
class MyCalculatorListenner implements ActionListener{
   //获得计算器对象,在一个类中组合另一个类
    Calculator calculator=null;
    public MyCalculatorListenner(Calculator calculator){
        this.calculator=calculator;
​
    }
​
    @Override
    public void actionPerformed(ActionEvent e) {
        int n1=Integer.parseInt(calculator.T1.getText());
        int n2=Integer.parseInt(calculator.T2.getText());
​
        calculator.T3.setText(""+(n1+n2));
        calculator.T1.setText("");
        calculator.T2.setText("");
    }
}

两个代码效果都是一样的,但是第二个完全面向对象,第一个面向过程。

高级!!!

相关推荐
XiaoLeisj2 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck2 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei2 小时前
java的类加载机制的学习
java·学习
励志成为嵌入式工程师3 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉3 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer3 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq4 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml44 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~4 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616884 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端