GUI编程03-事件监听

news2024/11/28 12:42:23

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

例如之前在关闭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("");
    }
}

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

高级!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1815962.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【多线程】进程与线程

🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. 操作系统2. 进程2.1 进程是什么2.2 进程管理2.3 进程调度2.3 内存管理2.4 进程间通信 3. 线程3.1 线程是什…

Keepalived LVS群集

一、Keepalived案例分析 企业应用中,单台服务器承担应用存在单点故障的危险 单点故障一旦发生,企业服务将发生中断,造成极大的危害 二、Keepalived工具介绍 专为LVS和HA设计的一款健康检查工具 支持故障自动切换(Failover&#…

VLM训练——Trainer源码解读

本文将以LLaVa源码为例,解析如何使用Trainer训练/微调一个VLM。 1. 参数解析ModelArgumentsDataArgumentsTrainingArguments 2. 加载模型3. 加载数据4. 创建Trainer开始训练 1. 参数解析 VLM 和 LLM 相关训练框架都会引入 ModelArguments、DataArguments、Trainin…

高考志愿填报秘籍:个人篇

选择适合自己的大学和专业,对广大考生来说至关重要。从某种程度上来说,决定了考生未来所从事的行业和发展前景。为了帮助广大考生更加科学、合理地填报志愿,选择适合自己的大学和专业,本公众号将推出如何用AI填报高考志愿专栏文章…

Linux环境各种软件安装配置

安装Java 官网 找个喜欢的版本 下载好了传到linux里,xshell的xftp直接拖过去就可以传 #安装rpm包管理 yum install -y rpm or apt-get install rpm #查找Java rpm -qa | grep java\|jdk\|gcj\|jre #卸载java rpm -e --nodeps jdk-1.8-1.8.0_401-10.x86_64 #安装 …

明基的台灯值得入手吗?书客、柏曼真实横向测评对比

近年来人们在工作、学习、娱乐等方面对电子设备的依赖程度也越来越高,长时间使用电子设备会对眼睛造成一定的伤害,如眼疲劳、干涩、近视等。人们对于能够缓解眼疲劳的照明产品的需求逐渐增加。护眼台灯能够更好地模拟自然光,提供更加柔和舒适…

AD24设计步骤

一、元件库的创建 1、AD工程创建 然后创建原理图、PCB、库等文件 2、电阻容模型的创建 注意:防止管脚时设置栅格大小为100mil,防止线段等可以设置小一点,快捷键vgs设置栅格大小。 1.管脚的设置 2.元件的设置 3、IC类元件的创建 4、排针类元件模型创建…

机器学习笔记 - 用于3D数据分类、分割的Point Net简述

一、简述 在本文中,我们将了解Point Net,目前,处理图像数据的方法有很多。从传统的计算机视觉方法到使用卷积神经网络到Transformer方法,几乎任何 2D 图像应用都会有某种现有的方法。然而,当涉及到 3D 数据时,现成的工具和方法并不那么丰富。3D 空间中一个工具就是Point …

14、modbus poll 使用教程小记1

开发平台:Win10 64位 Modbus Slave版本:64位 7.0.0 Modbus Poll版本:64位 7.2.2 因为项目中经常会用到modbus协议,所以就避免不了的要使用modbus测试工具,Modbus Slave/Poll无疑是众多测试工具中应用最广泛的。 文章目…

dll文件丢失了要如何处理?教你一键修复所有dll缺失的方法

dll文件丢失了要如何处理?其实dll文件的丢失还是比较常见的,它的丢失会引起一些程序无法启动,所以我们必须要去修复dll文件,这点是毋容置疑的,其修复方法也是有很多种的,今天就来给大家详细的聊一下dll文件…

BUAA-2024年春-OO第四单元总结

正向建模与开发 在本单元中,我们需要模拟一个小型的图书管理系统,完成图书馆所支持的相关业务,并遵守一定的规章制度。与前几次不同的是,本单元中,我们需要预先将自己的设计思路用UML来实现,然后进行编程。…

Coze+Discord:打造你的免费AI助手(教您如何免费使用GPT-4o/Gemini等最新最强的大模型/Discord如何正确连接Coze)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 准备Discord📝 准备Coze🔌 连接💡 测试效果⚓️ 相关链接 ⚓️📖 介绍 📖 你是否想免费使用GPT-4o/Gemini等最新最强的大模型,但又不想花费高昂的费用?本文将教你如何通过Coze搭建Bot,并将其转发…

RAG系统进阶(五)文本分割优化技巧及代码

背景 前边在介绍RAG系统时提到了文本分割(或分段)的作用和重要性。也提到了分段后所带来的一些问题,比如由于分段导致检索出来的TOP-n的结果可能未包含完整的答案。 粒度太大可能导致检索不精准,粒度太小可能导致信息不全面问题的…

教你一段代码激活计算机系统

方法简单粗暴,再也不用遭受未激活的烦恼了! 新建文本 输入代码,把文件后缀.txt改.bat slmgr /skms kms.03k.org slmgr /ato

2024-2025最新软考系统架构设计师的复习资料教材,解决如何快速高效通过该考试,试题的重点和难点在哪里?案例分析题和论文题的要点和踩坑点分析

目录 引言考试概述 考试结构考试内容 复习策略 制定复习计划学习资源 知识点详解 系统架构基础设计原则与模式系统分析与设计软件开发过程项目管理系统集成性能与优化安全性设计新兴技术 试题解析 选择题案例分析题论文题 重点与难点分析模拟试题与答案参考资料总结 引言 系…

DeepSpeed Pipeline并行

DeepSpeed为了克服一般Pipeline并行的forward时weights,和backward时计算梯度的weights, 二者不相同的问题,退而求其次,牺牲性能,采用gradient-accumulate方式,backward时只累积梯度至local,并不更新weights&#xff1…

css display:grid布局,实现任意行、列合并后展示,自适应大小屏幕

现有6X7列的一个布局&#xff0c;如下图所示 想要用户能组成任意矩形盒子&#xff0c;并展示内容&#xff0c;具体效果如下&#xff08;仅为一个示例&#xff0c;其实可以任意组合矩形&#xff09;&#xff1a; html代码&#xff1a; <div class"grid-container"…

SQL 截取函数

目录 1、substring 2、left 3、right 4、substring_index 1、substring 用途&#xff1a;字段截取从指定开始的字符开始&#xff0c;截取要的数&#xff1b;指定开始的字符数字可以用负的&#xff0c;指定开始的字符从后往前(向左)数&#xff0c;截取要的数不能为负。 语…

BoxSizer布局

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在前面的实例中&#xff0c;使用了文本和按钮等控件&#xff0c;并将这些控件通过pos参数布置在pannel画板上。虽然这种设置坐标的方式很容易理解&am…

GitLab教程(四):分支(branch)和合并(merge)

文章目录 1.分支&#xff08;branch&#xff09;&#xff08;1&#xff09;分支的概念&#xff08;2&#xff09;branch命令 2.合并&#xff08;merge&#xff09;&#xff08;1&#xff09;三个命令pullfetchmergegit fetchgit mergegit pull &#xff08;2&#xff09;合并冲…