中秋特辑:Java事件监听实现一个猜灯谜小游戏

news2024/11/25 12:25:25

众所周知,JavaSwing是Java中关于窗口开发的一个工具包,可以开发一些窗口程序,然后由于工具包的一些限制,导致Java在窗口开发商并没有太多优势(当然也有一些第三方的工具包也很好用),不过,在JavaSwing中关于事件的监听机制是我们需要重点掌握的内容。

何为事件监听

在Java中,事件监听(Event Listening)是一种处理用户交互的机制。通过事件监听,你的程序可以在用户进行某些操作(如点击按钮、输入文本、移动鼠标等)时执行特定的任务。

事件监听通常涉及三个组成部分:

  1. 事件源:这是产生事件的组件。例如,一个按钮、一个文本框、一个菜单等都可以是事件源。
  2. 事件:这是用户与事件源交互的动作。例如,点击、键入、鼠标移动等。每个事件类型都有一个对应的Java类,例如ActionEventKeyEvent等。
  3. 事件监听器:这是一个特殊的类,用于处理事件。你需要创建一个实现了特定事件监听器接口的类,并覆盖其中的方法以定义当事件发生时要执行的操作。例如,如果你想要在用户点击按钮时显示一条消息,你可以创建一个实现ActionListener接口的类,并在actionPerformed方法中显示消息。

事件监听的工作原理是:你将事件监听器注册到事件源上,当用户与事件源交互时,Java运行环境会自动调用相应的事件监听器处理事件。

当然了,以上是官方的一些概念,一如既往地晦涩难懂,简单点说,就是你在点击窗口中的一些操作按钮时,Java程序是如何知道你点击了它们呢?其中就用到了一些回调方法,当你点击按钮的时候,便会调用这些回调方法,此时Java程序便知道你点击了某个按钮,接下来就可以进行程序的下一步操作。

比如下面的一个程序:

public class Example {
    public static void main(String[] args) {
        JFrame frame = new JFrame("事件监听");
        frame.setLocationRelativeTo(null); 
        JButton button = new JButton("点我试试!");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, "你真点啊");
            }
        });
        frame.getContentPane().add(button);
        frame.setSize(300, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

在这个程序中,我们创建了一个窗口,并在窗口中添加了一个按钮,此时通过调用addActionListener给按钮添加了一个点击事件,其中有回调方法actionPerformed,当点击按钮时便会调用它,我们来试一试:

image.png

现在点击它:

image.png

这样一个点击事件的监听就完成了。

具体的执行流程如下图:

image.png

动手实现一个猜灯谜小游戏

现在我们就可以用所学知识做一个简单的猜灯谜小游戏了,首先我们设计一下窗体:

image.png

我们可以做的简单点,将题目显示在出题框里,然后点击提交按钮提交答案,此时弹出输入框,下一题可以切换题目,先把窗体画出来:

public LanternRiddlesGame() {
    super("猜灯谜小游戏");

    // 创建标签和按钮
    riddleLabel = new JLabel(riddles[currentRiddleIndex]);
    submitButton = new JButton("提交");
    nextButton = new JButton("下一题");

    // 添加按钮监听器
    submitButton.addActionListener(this);
    nextButton.addActionListener(this);

    // 设置布局和组件位置大小
    setLayout(new FlowLayout());
    setSize(400, 300);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null); // 居中显示
    add(riddleLabel);
    add(submitButton);
    add(nextButton);
    setVisible(true);
}

那么接下来的步骤就非常简单了,对里面的控件进行事件的监听:

@Override
public void actionPerformed(ActionEvent e) {
    if (e.getSource() == submitButton) {
        // 处理提交答案逻辑
        String userAnswer = JOptionPane.showInputDialog("请输入你的答案:");
        if (userAnswer.equalsIgnoreCase(answers[currentRiddleIndex])) {
            JOptionPane.showMessageDialog(this, "回答正确!");
        } else {
            JOptionPane.showMessageDialog(this, "回答错误!");
        }
    } else if (e.getSource() == nextButton) {
        // 处理下一题逻辑
        currentRiddleIndex++;
        if (currentRiddleIndex < riddles.length) {
            riddleLabel.setText(riddles[currentRiddleIndex]);
        } else {
            JOptionPane.showMessageDialog(this, "已经没有更多题目了!");
        }
    }
}

然后准备一下灯谜的素材,最后代码如下:

public class LanternRiddlesGame extends JFrame implements ActionListener {

    private JLabel riddleLabel;
    private JButton submitButton;
    private JButton nextButton;
    private String[] riddles = {
            "铁公鸡一毛不拔",
            "头上有青天",
            "纸上谈兵"
    };
    private String[] answers = { "一丝不苟", "高瞻远瞩", "言之无物" };
    private int currentRiddleIndex = 0;

    public LanternRiddlesGame() {
        super("猜灯谜小游戏");

        // 创建标签和按钮
        riddleLabel = new JLabel(riddles[currentRiddleIndex]);
        submitButton = new JButton("提交");
        nextButton = new JButton("下一题");

        // 添加按钮监听器
        submitButton.addActionListener(this);
        nextButton.addActionListener(this);

        // 设置布局和组件位置大小
        setLayout(new FlowLayout());
        setSize(400, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null); // 居中显示
        add(riddleLabel);
        add(submitButton);
        add(nextButton);
        setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == submitButton) {
            // 处理提交答案逻辑
            String userAnswer = JOptionPane.showInputDialog("请输入你的答案:");
            if (userAnswer.equalsIgnoreCase(answers[currentRiddleIndex])) {
                JOptionPane.showMessageDialog(this, "回答正确!");
            } else {
                JOptionPane.showMessageDialog(this, "回答错误!");
            }
        } else if (e.getSource() == nextButton) {
            // 处理下一题逻辑
            currentRiddleIndex++;
            if (currentRiddleIndex < riddles.length) {
                riddleLabel.setText(riddles[currentRiddleIndex]);
            } else {
                JOptionPane.showMessageDialog(this, "已经没有更多题目了!");
            }
        }
    }

    public static void main(String[] args) {
        new LanternRiddlesGame();
    }
}

来看看效果:

image.png

点击提交按钮进行答题:

image.png

此时回答正确:

image.png

点击下一题可以切换题目,这样一个简单的猜灯谜小游戏就制作完成了。

马上也要到中秋和国庆的日子了,在这里也提前祝各位读者朋友中秋节快乐!

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

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

相关文章

使用Python CV2融合人脸到新图片--优化版

优化说明 上一版本人脸跟奥特曼图片合并后边界感很严重&#xff0c;于是查找资料发现CV2还有一个泊松函数很适合融合图像。具体代码如下&#xff1a; import numpy as np import cv2usrFilePath "newpic22.jpg" atmFilePath "atm2.jpg" src cv2.imrea…

java基础-集合-ArrayList(JDK1.8)源码学习

文章目录 类图新增addensureCapacityInternalensureExplicitCapacitygrowhugeCapacity 删除removefastRemove 遍历Iterator 类图 新增 add public boolean add(E e) {// 根据注释可知 Increments modCount!!&#xff0c;modCount下面详解ensureCapacityInternal(size 1); //…

特斯拉Dojo超算:AI训练平台的自动驾驶与通用人工智能之关键

特斯拉公开Dojo超算架构细节&#xff0c;AI训练算力平台成为其自动驾驶与通用人工智能布局的关键一环 在近日举行的Hot Chips 34会议上&#xff0c;特斯拉披露了其自主研发的AI超算Dojo的详细信息。Dojo是一个可定制的超级计算机&#xff0c;从芯片到系统全部由特斯拉自主设计…

如何优化网站SEO(百度SEO优化的6个方案及密度)

一&#xff1a;蘑菇号https://www.mooogu.cn/ SEO优化是提高网站在搜索引擎中排名的关键技术。对于新网站而言&#xff0c;如何快速提高百度排名是每个站长需要关注的问题。下面我们将介绍新网站百度SEO具体方法。 二&#xff1a; 首先&#xff0c;通过网站架构优化来提高页…

解决5053无法安装驱动的故障

用5053连接车机&#xff0c;发现驱动上面有一个问号&#xff0c;看来驱动出问题了&#xff0c;试着用原来的办法无法强行安装&#xff0c;出现如下报错: 主要原因是老旧的设备驱动程序没有及时更新&#xff0c;遭到了新系统的嫌弃&#xff0c;导致数字签名验证失败&#xff0c;…

golang for循环append的数据重复

原因&#xff0c;因为使用了& 需要增加一行&#xff0c;问题解决

华为云云耀云服务器L实例评测| 搭建属于自己的第一个中秋快乐网页

华为云服务器 1 如何快速获得一个华为云服务器1.1 注册华为云账号1.2 选择华为云服务器实例 (云耀L系列)1.3 选择服务器区域1.4 选择实例规格1.5 付款界面确认实例参数&#xff0c;支付即可 2 运行自己的服务器2.1 找到自己的服务器控制面板2.2 了解服务器面板2.3 登录我们的服…

【网络编程】TCP Socket编程

TCP Socket编程 1. ServerSocket2. Socket3. TCP的长短连接4. Socket 通信模型5. 代码示例&#xff1a;TCP 回显服务器 流套接字&#xff1a; 使用传输层TCP协议 TCP: 即Transmission Control Protocol&#xff08;传输控制协议&#xff09;&#xff0c;传输层协议。 TCP的特点…

Pycharm配置环境以及Teminal不能使用问题解决

Pycharm配置环境 配置好环境后点击Terminal Teminal不能使用问题解决 我的报错信息&#xff1a; Import-Module : 无法加载文件 D:\Anaconda\shell\condabin\Conda.psm1&#xff0c;因为在此系统上禁止运行脚本。 解决方案&#xff1a; 第一步.&#xff1a;在 Windows 下用…

K8S名称空间和资源配额

Kubernetes 支持多个虚拟集群&#xff0c;底层依赖于同一个物理集群。 这些虚拟集群被称为名称空间。名称空间namespace是k8s集群级别的资源&#xff0c;可以给不同的用户、租户、环境或项目创建对应的名称空间&#xff0c;例如&#xff0c;可以为test、dev、prod环境分别创建各…

服务器搭建(TCP套接字)-基础版(服务端)

一、socket 1.1、vim man查看socket :!man socket1.2、 依赖的头文件 #include <sys/types.h> #include <sys/socket.h>1.3、原型 int socket(int domain, int type, int protocol);domain说明AF_INETIPV4协议AF_INET6IPV6协议AF_LOCALUnix域协议 type说明S…

JavaScript中的垃圾回收机制

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ JavaScript的垃圾回收机制⭐ 内存管理⭐ 引用计数⭐ 标记-清除算法⭐ 内存泄漏⭐ 性能优化⭐ 使用delete操作符⭐ 注意循环中的变量引用⭐ 使用工具进行内存分析⭐ 使用合适的数据结构⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探…

企业架构LNMP学习笔记54

企业架构NoSQL数据库之MongoDB。 学习目标和内容&#xff1a; 1&#xff09;能够简单描述mongoDB的使用特点&#xff1a; 2&#xff09;能够安装配置启动MongoDB&#xff1b; 3&#xff09;能够使用命令行客户端简单操作MongoDB&#xff1b; 4&#xff09;能够实现基本的数…

vsftp3.0 匿名用户,本地用户,虚拟用户

整体配置介绍&#xff1a; 进入vsftpd配置文件 vim /etc/vsftpd/vsftpd.conf //输入i开始编辑&#xff0c;修改后按esc退出编辑&#xff0c;输入:wq后回车保存并退出anonymous_enableYES #接受匿名用户&#xff0c;默认无密码请求 lo…

01_Elasticsearch入门介绍

01_Elasticsearch入门介绍 Elasticsearch 是什么1、什么是搜索&#xff1f;2、如果用数据库做搜索会怎么样&#xff1f;3、什么是全文检索和Lucene&#xff1f;4、什么是Elasticsearch&#xff1f;5、Elasticsearch的功能6、Elasticsearch的适用场景7、Elasticsearch的特点 什么…

Anaconda成功安装之后没有在菜单列和桌面显示图标

1、进入命令提示符 2、输入cmd 3、进入到Anaconda安装路径 比如我装在F盘 4、然后输入 python .\Lib\_nsis.py mkmenus 回车 这时候菜单列就可以看到了

第 4 章 串(串的堆分配存储实现)

1. 背景说明 实现基本与定长分配一致&#xff0c;不过将定长分配改为动态分配&#xff0c;解除了长度限制&#xff0c;实现更加灵活。 2. 示例代码 1) status.h /* DataStructure 预定义常量和类型头文件 */#ifndef STATUS_H #define STATUS_H#define CHECK_NULL(pointer) if …

[JAVAee]spring-Bean对象的执行流程与生命周期

执行流程 spring中Bean对象的执行流程大致分为四步: 启动Spring容器实例化Bean对象Bean对象注册到Spring容器中将Bean对象装配到所需的类中 ①启动Spring容器,在main方法中获取spring上下文对象并配备spring. import demo.*;import org.springframework.context.Applicati…

nacos动态配置刷新机制原理

nacos动态配置刷新机制原理 项目里面许多业务场景以及灵活配置的需求经常要用到动态配置。一般就是apollo和nacos两种选型。 nacos动态刷新导致的bug nacos一般为了实现动态配置一般会加入RefreshScope注解进行实现&#xff0c;例如下面的代码加入了RefreshScope想要实现跨域…

智能家居监控管理系统项目需求分析

目录 一、引言 1、目的 2、背景 二、项目系统概述 1、项目产品概述 2、项目功能架构 3、项目市场需求 三、项目硬件需求 1、核心开发板 2、实时检测模块 3、实时信息交互模块 4、用户安全登录模块 5、开发板可扩展模块 6、硬件之间连接设备 四、项…