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

众所周知,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() {@Overridepublic 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);}@Overridepublic 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.mzph.cn/news/83005.shtml

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

相关文章

【卷积神经网络】ResNets 残差网络

通常来说&#xff0c;增加卷积神经网络的层数有利于提高模型的准确率&#xff0c;但是深层的神经网络也变得难以训练的&#xff0c;因为存在梯度消失与梯度爆炸问题。Microsoft 亚洲研究院的 Kaiming He 等人提出了一个残差学习框架&#xff0c;以简化对 CNN 网络的训练。通过将…

基于SpringBoot+Vue的餐饮管理系统设计与实现

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

Linux 挂载

挂载需要挂载源和挂载点 虚拟机本身就有的挂源 添加硬件 重启虚拟机 操作程序 sudo fdisk -l //以管理员权限查看电脑硬盘使用情况sudo mkfs.ext4 /dev/sdb //以管理员身份格式化硬盘sudo mkdir guazai //创建挂载文件夹 sudo mount /dev/sdb/guazai //将挂载源接上挂载点 s…

嵌入式C语言知识复习和提高

文章目录 前言基础知识main函数防BUG注释&#xff08;重要&#xff09;关键字标识符命名&#xff08;驼峰命名&#xff09;常量类型变量printf1.输出不同类型数据2.输出不同宽度数据3.不同类型数据长度归类 scanf函数运算符sizeof&#xff08;运算符&#xff0c;优先级2&#x…

欧拉操作系统在线安装mysql8数据库并用navicat premium远程连接

网上太多安装教程&#xff0c;但是没有一个教程能够一站式解决安装问题&#xff0c;而我不一样&#xff0c;我写的每一个博客&#xff0c;都是我自己试验过很多次&#xff0c;能够确保一站式解决&#xff0c;才会发上去&#xff0c;希望能够帮助到大家 第一步&#xff1a;升级…

恒合仓库 - 仓库管理系统搭建

仓库管理系统搭建 文章目录 仓库管理系统搭建一、项目介绍1.1 项目描述1.2 技术选型1.3 模块划分 二、搭建前端环境三、搭建后端环境3.1 创建springboot项目 - 划分包层次3.2 导入依赖3.3 启动类配置3.4.配置文件配置 一、项目介绍 1.1 项目描述 项目搭球为满足日益扩大的仓库…

Matlab图像处理-区域描述

一旦一幅图像的目标区域被确定&#xff0c;我们往往用一套描述子来表示其特性。选择区域描述子的动机不单纯为了减少在区域中原始数据的数量&#xff0c;而且也应有利于区别带有不同特性的区域。因此&#xff0c;当目标区域有大小、旋转、平移等方面的变化时&#xff0c;针对这…

力扣 -- 394. 字符串解码

解题方法&#xff1a; 参考代码&#xff1a; class Solution{ public:string decodeString(string s){stack<string> sst;stack<int> dst;//防止字符串栈为空的时候再追加字符串到栈顶元素sst.push("");int n s.size();int i 0;while(i<n)//最好不…

高级运维学习(九)块存储、文件系统存储和对象存储的实现

块存储基础 块设备存取数据时&#xff0c;可以一次存取很多。字符设备只能是字符流 [rootceph1 ~]# ll /dev/sda brw-rw---- 1 root disk 8, 0 Dec 12 13:15 /dev/sda # b表示block&#xff0c;块设备[rootceph1 ~]# ll /dev/tty crw-rw-rw- 1 root tty 5, 0 Dec 12 13:31 /d…

工业机器人仿真参考

最近有一些朋友看到我做的关于Unity3d仿真机器人的项目&#xff0c;本次我在平台做以分享&#xff0c;希望的朋友或者有需要在此基础做开发的可以参考下。 开发工具&#xff1a; 下位机&#xff1a;Unity3D 上位机&#xff1a;Visual Studio 机械臂模型&#xff1a;TH6-QKM…

高云FPGA系列教程(7):ARM GPIO外部中断

文章目录 [toc]GPIO中断简介FPGA配置常用函数MCU程序设计工程下载 本文是高云FPGA系列教程的第7篇文章。 本篇文章介绍片上ARM Cortex-M3硬核处理器GPIO外部的使用&#xff0c;演示按键中断方式来控制LED亮灭&#xff0c;基于TangNano 4K开发板。 参考文档&#xff1a;Gowin_E…

L1-027 出租

一、题目再现 下面是新浪微博上曾经很火的一张图&#xff1a; 一时间网上一片求救声&#xff0c;急问这个怎么破。其实这段代码很简单&#xff0c;index数组就是arr数组的下标&#xff0c;index[0]2 对应 arr[2]1&#xff0c;index[1]0 对应 arr[0]8&#xff0c;index[2]3 对应…

消息队列(五):虚拟主机设计

虚拟主机存在的意义 一个虚拟主机类似于 MySQL 的 database&#xff0c;把交换机&#xff0c;队列&#xff0c;绑定&#xff0c;消息....进⾏逻辑上的隔离&#xff0c;⼀个服务器可以有多 个虚拟主机&#xff0c;此处我们项⽬就设计了⼀个虚拟主机&#xff08;VirtualHost&…

GO-日志分析

GO-日志分析 log包简介 Go提供了logger包来做日志记录。使用方式如下所示 package mainimport ("log""os" )func main() {// 创建一个新的日志文件.默认是stdOutfile, err : os.Create("app.log")if err ! nil {log.Fatal(err)}defer file.Cl…

源码编译Qt 5.15.9+msvc2019

官方文档里给出了详细步骤&#xff1a; Building Qt Sources Building Qt 5 from Git (Wiki) 注&#xff1a;本文基于windows11vs2019x64qt5.15.9&#xff0c;不编译Qt WebEngine 归纳总结如下&#xff1a; 准备阶段 Qt for Windows - Requirements 安装python&#xff0c;…

[npm]package.json文件

[npm]package.json文件 生成 package.jsonpackage.json 必须属性nameversion 描述信息descriptionkeywordsauthorcontributorshomepagerepositorybugs 依赖配置dependenciesdevDependenciespeerDependenciesoptionalDependenciesbundledDependenciesengines 脚本配置scriptscon…

无涯教程-JavaScript - PI函数

描述 PI函数返回数字3.14159265358979,数学常数pi,精确到15位数字。 语法 PI ()争论 PI函数语法没有参数。 适用性 Excel 2007,Excel 2010,Excel 2013,Excel 2016 Example JavaScript 中的 PI函数 - 无涯教程网无涯教程网提供描述PI函数返回数字3.14159265358979,数学常…

半导体划片机工艺应用

半导体划片工艺是半导体制造过程中的重要步骤之一&#xff0c;主要用于将大尺寸的晶圆切割成小片&#xff0c;以便进行后续的制造和封装过程。以下是一些半导体划片工艺的应用&#xff1a; 晶圆划片&#xff1a;在半导体制造过程中&#xff0c;需要将大尺寸的晶圆切割成小片&am…

虚拟机(VMM)

一、虚拟机概念 虚拟机又名虚拟机管理程序、虚拟机监控程序、VMM 使用虚拟化技术&#xff0c;将一台物理机器虚拟化为多台虚拟机器&#xff0c;每台虚拟机器都可以独立一个操作系统。 传统的计算机&#xff0c;一台物理机器只能运行一个操作系统。 二、虚拟机的分类 第一类VMM&…

【Linux 服务器运维】定时任务 crontab 详解 | 文末送书

文章目录 前言一、crontab 介绍1.1 什么是 crontab1.2 crontab 命令工作流程1.3 Linux 定时任务分类 二、crontab 用法详解2.1 crond 服务安装2.2 crontab 文件内容分析2.3 crontab 命令用法2.3.1 查看定时任务列表2.3.2 编辑/创建定时任务2.3.3 删除定时任务2.3.4 其他 cronta…