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("");
    }
}

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

高级!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每日一练:攻防世界:base64stego

base64stego: 打开压缩包发现被加密,用winhex查看,发现是伪加密,修改文件目录区的全局方式位标记,成功打开压缩包,得到一个文本 这里我想的有三种情况:1.直接base64解码,然后看解码…

美业SaaS收银系统拓客系统源码分享-预约管理功能的作用和重要性

美业收银管理系统对于美容、美发、医美行业的门店来说至关重要,它不仅可以帮助提高管理效率和降低成本,还可以改善客户体验并促进业务增长。 (私信获取源码/演示视频) ▶ 美业系统中的【预约管理】有多种作用,包括&…

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

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

微信小程序毕业设计-驾校管理系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

Spring Security实现用户认证四:使用JWT与Redis实现无状态认证

Spring Security实现用户认证四&#xff1a;使用JWT与Redis实现无状态认证 1 什么是无状态认证&#xff1f;2 什么是JWT&#xff1f;2.1 需要注意的事项2.2 JWT构成 3 Spring Security JWT实现无状态认证3.1 创建一个Spring Boot项目3.1.1 依赖3.1.2 Main3.1.3 application.ym…

CMS与AI的融合:构建万能表单小程序系统

引言&#xff1a; 随着人工智能技术的飞速发展&#xff0c;MyCMS作为一款功能强大的内容管理系统&#xff0c;通过集成AI技术&#xff0c;进一步拓展了其应用范围和智能化水平。本文将探讨如何利用MyCMS结合AI技术&#xff0c;构建一个能够将用户提交的万能表单数据转化为智能提…

白话解读网络爬虫

网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;也称为网络蜘蛛、网络机器人或网络蠕虫&#xff0c;是一种自动化程序或脚本&#xff0c;被用来浏览互联网并收集信息。网络爬虫的主要功能是在互联网上自动地浏览网页、抓取内容并将其存储在本地或远程服务器上供后续处…

SpringBoot+MyBatis批量插入数据的三种方式

文章目录 1. 背景介绍2. 方案介绍2.1 第一种方案&#xff0c;用 for语句循环插入&#xff08;不推荐&#xff09;2.2 第二种方案&#xff0c;利用mybatis的foreach来实现循环插入&#xff08;不推荐&#xff09;2.3 第三种方案&#xff0c;使用sqlSessionFactory实现批量插入&a…

【文献阅读】一种多波束阵列重构导航抗干扰算法

引言 针对导航信号在近地表的信号十分微弱、抗干扰能力差的问题&#xff0c;文章提出了自适应波束形成技术。 自适应波束形成技术可以分为调零抗干扰算法和多波束抗干扰算法。 调零抗干扰算法主要应用功率倒置技术&#xff0c;充分利用导航信号功率低于环境噪声功率的特点&…

Generative AI原理本质、技术内核及工程实践之基于Vertex AI的大模型 (二)Generative AI on Vertex AI 概览

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

如何挑选靠谱的软件开发公司?

在数字化的大潮中&#xff0c;企业商家都明白一个道理&#xff1a;没有一艘强大的软件开发公司“战舰”&#xff0c;想在商海中乘风破浪可不容易。但问题是&#xff0c;市场上那么多软件开发公司&#xff0c;如何挑选出最靠谱的那一家呢&#xff1f;别急&#xff0c;这篇文章就…

进程和内存管理

内存的使用和剩余情况 当前cpu的负载情况 找进程的id 结束某个进程 检查内存&#xff1a; 方法一&#xff1a;/proc/meminfo注意&#xff1a;这是个伪文件&#xff0c;这个文件记录了内存的相关信息&#xff0c;不可以用vi打开&#xff0c;应该用cat查看方法二&#xff1a;fre…

数字员工将重塑工作与生产的未来格局?

数字员工&#xff0c;由AI、机器学习和自动化技术驱动&#xff0c;正逐渐取代或协助人类完成从基础到高端的任务&#xff0c;极大提升工作效率&#xff0c;并改变工作认知。它们不仅影响各行业&#xff0c;还重塑人与机器、社会、自然的关系。与二十世纪末的国企下岗变革相比&a…

SaaS企业营销:如何通过联盟计划实现销售增长?

联盟营销计划在国外saas行业非常盛行&#xff0c;国内如何借鉴国外的成功案例运用联盟计划实现销售增长呢&#xff1f;林叔今天以最近新发现的leadpages为例分享下经验。 Leadpages是一款用户友好的落地页制作工具&#xff0c;提供多种预设计模板、A/B测试和分析功能&#xff0…

实例详解C/C++中static与extern关键字的使用

目录 1、概述 2、编译C++代码时遇到的变量及函数重复定义的问题 3、用 extern 声明外部变量 4、extern与全局函数 5、为何在变量和函数前添加一个static关键字编译就没问题了呢? 6、静态局部变量 7、函数的声明与定义都放置到一个头文件中,不使用static,通过宏控制去…

安灯(andon)系统如何帮助工厂流水线实现精益生产

在当今竞争激烈的制造业领域&#xff0c;实现精益生产已成为众多工厂追求的目标。而安灯&#xff08;Andon&#xff09;系统在这一过程中发挥着至关重要的作用。 安灯&#xff08;Andon&#xff09;系统通过及时反馈和沟通机制&#xff0c;让生产过程中的问题能够迅速被察觉和解…

Si24R05—高度集成的低功耗 2.4G+125K SoC 芯片

Si24R05是一款高度集成的低功耗SoC芯片&#xff0c;具有低功耗、Low Pin Count、宽电压工作范围&#xff0c;集成了13/14/15/16位精度的ADC、LVD、UART、SPI、I2C、TIMER、WUP、IWDG、RTC、无线收发器、3D低频唤醒接收器等丰富的外设。内核采用RISC-V RV32IMAC&#xff08;2.6 …

VOP | Point Cloud

目录 Point Cloud Open —— 打开点云文件并搜索源位置周围的点 Point Cloud Find —— 返回最近点的点号列表 Point Cloud Find Radius —— 返回最近点的点号列表并考虑被搜索点的半径 Point Cloud Filter —— 过滤查询到的点以生成加权值 Point Cloud Farthest —— 查…

第二证券股市资讯:半导体,突发!

半导体又现突发&#xff01; 商场忽然传出&#xff0c;拜登政府正在考虑约束我国获取应用在人工智能&#xff08;AI) 芯片上的全栅级晶体管技能&#xff08;Gate-all-around, GAA) &#xff0c;但不过现在还不清楚美国官员何时会做出最终决议。从趋势来看&#xff0c;这意味着…

【Ardiuno】实验ESP32单片机自动配置Wifi功能(图文)

这里小飞鱼按照ESP32的示例代码&#xff0c;实验一下wifi的自动配置功能。所谓的自动配置&#xff0c;就是不用提前将wifi的名称和密码写到程序里&#xff0c;这样可以保证程序在烧录上传后&#xff0c;可以通过手机端的软件来进行配置&#xff0c;可以避免反复修改代码&#x…