中秋特辑: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.rhkb.cn/news/135439.html

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

相关文章

一款适用于教培机构的微信CRM系统

在教育培训行业中&#xff0c;有效的客户关系管理&#xff08;CRM&#xff09;系统至关重要。微信作为一种流行的社交媒体平台&#xff0c;具有巨大的潜在价值&#xff0c;可以被用来提升教培机构的客户管理和销售效率。 一些教育培训行业存在的问题 ①每年开班收学员太多&…

二叉树的几个递归问题

我的主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言&#xff1a; 二叉树的递归是二叉树很重要的问题&#xff0c;几乎解决二叉树的问题都要使用递归&#xff0c;接下来我们将解决二叉树几个最基础的递归问题。 目录 前言&#xff1a; 二叉树的前序&#xff0c;中序&…

JDK jps命令复习

之前写过jdk命令工具的博文&#xff0c;下面复习jps命令&#xff1b; jps 是 Java Process Status Tool 的简称,它的作用是为了列出所有正在运行中的 Java 虚拟机进程和相关信息&#xff1b; jps 命令参数 -q 只输出进程 ID,省略主类的名称 -m 输出虚拟机进程启动时传递…

基于Java新枫之谷游戏攻略设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

数据结构---链表(java)

目录 1. 链表 2. 创建Node 3. 增加 4. 获取元素 5. 删除 6. 遍历链表 7. 查找元素是否存在 8. 链栈的实现 9. 链队的实现 1. 链表 数据存放在"Node"结点中 优点&#xff1a;不用考虑扩容和缩容的问题&#xff0c;实现了动态存储数据 缺点&#xff1a;没有…

在Python中 作用域与命名空间的坑

前言&#xff1a; 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 1. 命名空间 1.1 什么是命名空间 Namespace命名空间&#xff0c;也称名字空间&#xff0c;是从名字到对象的映射。 Python中&#xff0c;大…

【多卡训练报错】:The server socket has failed to listen on any local network address.

错误&#xff1a; RuntimeError: The server socket has failed to listen on any local network address. The server socket has failed to bind to [::]:16664 (errno: 98 - Address already in use). The server socket has failed to bind to 0.0.0.0:16664 (errno: 98 -…

JMeter:接口测试基础介绍

一、什么是接口 接口是非常抽象的概念&#xff0c;先来看下中国最大的综合性辞典《辞海》是怎样定义接口的&#xff1a; 两个不同系统或系统中两个不同特性部分的交接部分。一般分硬件接口和软件接口两种。前者是为连接计算机各部分之间、计算机与计算机之间、计算机与外部系统…

虚拟机Ubuntu操作系统常用终端命令(3)(详细解释+详细演示)

本篇概要 本篇讲述了Ubuntu操作系统常用的几个功能&#xff0c;即修改文件权限、修改文件属性、可执行脚本、虚拟机网络、FTP服务器、SSH服务器、VIM等方面的知识。希望能够得到大家的支持。 文章目录 本篇概要1.修改文件权限2.修改文件属主3.可执行脚本3.1要点与细节3.2shell…

芯科蓝牙BG27开发笔记7-配置蓝牙参数

基础的要求 1. 设置广播参数为间隔1000ms&#xff0c;不停止 2. 添加广播消息&#xff0c;含01、03、09、FF TYPE 3. 设置蓝牙通信间隔参数为320ms、400ms、2、4000ms超时 3. 配置发射功率为较低 4. 配置GATT所有数据与原Nordic 配置一致 为了解决以上疑问&#xff0c;需…

error:03000086:digital envelope routines::initialization error问题解决

目录 问题描述&#xff1a;error:03000086:digital envelope routines::initialization error 问题原因&#xff1a;nodejs V17 版本发布了 OpenSSL3.0 对算法和秘钥大小增加了更为严格的限制&#xff0c;nodeJs v17 之前版本没影响&#xff0c;但 V17 和之后版本会出现这个错…

【大规模 MIMO 检测】基于ADMM的大型MU-MIMO无穷大范数检测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

在MySQL中使用VARCHAR字段进行日期筛选

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

ubuntu+.net6+docker 应用部署教程

先期工作 1、本地首先安装 Docker Desktop 2、本地装linux in windows 3、生成镜像 后期工作 1、云服务器部署 生成镜像方法 1、生成Dockerfile配置文件 开发工具visual studio 2022 如果项目已经存在&#xff0c;可以选中项目&#xff0c;右键点击->选择添加Docker…

C#,数值计算——Hashtable的计算方法与源程序

1 文本格式 using System; using System.Collections; using System.Collections.Generic; namespace Legalsoft.Truffer { public abstract class Hashtable<K> { private int nhash { get; set; } private int nmax { get; set; } pr…

C# 实现迷宫游戏

智能提示&#xff1a; /// <summary>/// 迷宫/// </summary>internal class Maze : IDisposable{private MazeCell[,] cells;private readonly Stack<MazeCell> stack new Stack<MazeCell>();private readonly Random rand new Random();private int…

Nvm任意切换node版本号

前言&#xff1a; nvm&#xff08;Node Version Manager&#xff09;是一个用于管理Node.js版本的工具。它允许您在同一台计算机上同时安装和切换不同版本的Node.js。使用nvm&#xff0c;您可以轻松地在项目之间切换Node.js版本&#xff0c;而无需手动安装和卸载不同的版本。这…

简单的手机电脑无线传输方案(android@windows)

文章目录 abstractwindows浏览android文件环境准备客户端软件无线网络链接步骤其他方法 手机浏览电脑文件公网局域网everythingpython http.server abstract windows访问android文件 android访问桌面系统上的文件 windows浏览android文件 环境准备 客户端软件 android手机…

Nginx限制每秒请求次数,限制每秒连接次数,下载速度限制

Nginx限制每秒请求次数,限制每秒连接次数,下载速度限制。 为了防止网站被恶意攻击,总是需要做一些防护措施 最外层的web服务器是Nginx,于是寻找 nginx 的一些关于防护措施的配置,记录在此 一些变量 首先列举出会使用到的一些变量 限制请求数 首先需要定义限制区域,在…

leetcode 817. 链表组件(java)

链表组件 题目描述HashSet 模拟 题目描述 给定链表头结点 head&#xff0c;该链表上的每个结点都有一个 唯一的整型值 。同时给定列表 nums&#xff0c;该列表是上述链表中整型值的一个子集。 返回列表 nums 中组件的个数&#xff0c;这里对组件的定义为&#xff1a;链表中一段…