中秋特辑: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;…

【SSM】登录和注册

框架 controller 控制层 dao 持久层 interceptor 拦截器 model 实体层 uils 工具类 service 业务层 resources 资源文件层 mapper 放编写sql语句的文件&#xff0c;与持久层的文件对应 具体代码 Controller //控制层 public class UserController { //用于调用Servic…

Linux设备驱动之gpio-keys

Linux设备驱动之gpio-keys 前两个章节介绍了Linux字符设备和platform设备的注册&#xff0c;他们都是比较基础的&#xff0c;让大家理解Linux内核的设备驱动是如何注册、使用的。但在工作中&#xff0c;个人认为完全手写一个字符设备驱动的机会比较少&#xff0c;更多的都是基…

你的第1个 Unity 游戏!!!

简介 首先新建一个方块添加重力!!!总结首先 首先,你要先打开 U n i t y Unity Unity

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;升级…

Java手写背包问题算法应用拓展案例

Java手写背包问题算法应用拓展案例 1. 0-1背包问题 实际案例&#xff1a;购物问题 假设你是一个购物爱好者&#xff0c;你去商场购物&#xff0c;商场里有很多商品&#xff0c;每个商品有自己的重量和价值。你只有一个背包&#xff0c;它的容量是有限的。你希望在购物过程中…

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

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

Matlab图像处理-区域描述

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

2023 亲测好用版VScode配置文件

tasks.json {"tasks": [{"type": "cppbuild","label": "g++",// 调试会话开始前执行的任务,一般为编译程序,c++为g++, c为gcc 和launch中preLaunchTask保持一致// "command": "D:/Users/Downloads/ming…

力扣 -- 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…

从零开始:使用Python创建GUI驱动的简易国际象棋游戏

第一部分&#xff1a;国际象棋的基础 1. 介绍 国际象棋&#xff0c;一个古老而又充满策略的游戏&#xff0c;历经数世纪的发展&#xff0c;至今仍然广受喜爱。那么&#xff0c;如何使用Python来创建一个简单的国际象棋游戏&#xff0c;并给它加上一个图形界面(GUI)呢? 这篇文…

Python图像处理初探:Pillow库的基础使用

图像处理在许多领域都有广泛的应用&#xff0c;包括计算机视觉&#xff0c;机器学习&#xff0c;人工智能&#xff0c;网页开发等。Pillow库是Python中最流行的图像处理库之一&#xff0c;它是PIL&#xff08;Python Imaging Library&#xff09;的一个分支&#xff0c;提供了丰…

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

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

Android 下的usb框架及功能点

有关USB android框架的链接 http://blog.sina.com.cn/s/articlelist_1627432177_0_1.html ICS4.0下Framework层的usb框架 Android 下的usb主要工作还是在android的framework层。主要有以下几个文件&#xff1a; 1.1UsbDeviceManager.java/高 主要完成功能切换及状态的更新&a…

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 对应…