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

2023-09-13 17:47:54

众所周知,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

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

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

更多推荐

AI无法提振台积电股价

来源:猛兽财经作者:猛兽财经总结:(1)台积电的股价已经从最高点下跌了18%,很多期权交易员正在押注台积电的股价会进一步下跌。(2)华尔街分析师目前也下调了台积电的收入和盈利预期。台积电(TSM)的股价最近这段时间已经跌回到了了5月份之前的水平,很多期权交易员也正在押注台积电股价将在10月中旬进一步下跌。台积电股价的溢

服务器上一个域名对应多个前端项目的nginx转发配置

场景:当有两个前端项目A,B的时候,项目A(对应端口8000)和项目B(对应端口8001)分别部署在服务器的不同位置,通过服务器ip+端口都能正常访问单独的项目A和项目B;现在要求两个项目共用一个域名~~也就是说访问http://10.111.182.xxx:8000的时候默认访问项目A的资源,访问http://10.

MyBatis 基本使用

文章目录创建项目POJO对象添加配置文件编程式的使用代理方式的使用接口声明映射文件getMapper总结创建项目创建一个普通的Maven项目,然后添加对应的Mybatis和MySQL的相关依赖<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</a

Java中Hashset存储原理底层深挖

上课老师讲了Hashset的添加元素方法,感觉不甚准确,于是下课扒一扒底层源码,这一看,霍!原来如此。现在小丁来捋一遍他的存储原理。publicbooleanadd(Ee){returnmap.put(e,PRESENT)==null;}可以看到PRESENT是一个privatestaticfinal修饰的object

深入浏览器的渲染原理

一、网页的解析过程大家有没有深入思考过:一个网页URL从输入到浏览器中,到显示经历过怎么样的解析过程呢?要想深入理解下载的过程,我们还要先理解,一个index.html被下载下来后是如何被解析和显示在浏览器上的二、浏览器渲染流程1.浏览器的内核常见的浏览器内核有Trident(三叉戟):IE、360安全浏览器、搜狗高速

【java】【SpringBoot】【三】开发实用篇 基于SpringBoot整合任意第三方技术

目录一、热部署1、手动启动热部署2、自动启动热部署3、热部署范围配置4、关闭热部署二、配置高级1、@ConfigurationProperties2、宽松绑定/松散绑定3、常用计量单位绑定4、数据校验三、测试1、加载测试专用属性2、加载测试专用配置3、web环境模拟测试3.1模拟端口3.2虚拟请求测试3.3匹配响应执行

锂离子电池和电池组安全使用指南

声明本文是学习GB-T42729-2023锂离子电池和电池组安全使用指南.而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们1范围本文件提供了锂离子电池和电池组使用过程中的安全指导和建议,给出了锂离子电池和电池组制造厂商向用户提供可能发生危险的相关信息。本文件适用于锂离子电池和电池组的使用。2规范性引

系统架构设计师(第二版)学习笔记----信息安全基础知识

【原文链接】系统架构设计师(第二版)学习笔记----信息系统基础文章目录一、信息安全的概念1.1信息安全的基本要素1.2信息安全的内容1.3设备安全的内容1.4数据安全的内容1.5内容安全的含义1.6行为安全的含义二、信息存储安全2.1信息存储安全的内容有:2.2信息使用安全的内容2.3用户的标识与验证方法2.4用户存

【Docker】Docker安全性与安全实践(五)

前言:Docker安全性的作用和意义在于确保容器化应用程序和镜像的隔离性、保护数据和系统资源、防止恶意攻击,以及提高应用的整体安全性。文章目录1.Docker安全性1.1`隔离性`1.2`镜像安全`1.3`特权访问`1.4`数据保护`2.Docker安全实践2.1`使用官方镜像或可信源`2.2`更新和修补镜像`2.3`

【Rust 基础篇】Rust中的不安全函数:解锁系统级编程的黑盒之门

导言Rust是一种以安全性和高效性著称的系统级编程语言。它的设计哲学是在不损失性能的前提下,保障代码的内存安全和线程安全。为了实现这一目标,Rust引入了"借用检查器"和"所有权系统"等特性,有效地避免了空指针、数据竞争等常见的安全问题。然而,有些场景下,为了完成某些高级操作或者与底层交互,Rust需要突破其安全边界。

工业交换机为什么有必要进行老化测试?

我们可以根据客户的要求来制定老化测试的检测标准,如果没有特别的要求,我们将依照国家相应的标准进行老化测试检验。老化测试的主要目的是通过模拟产品在现实使用过程中所面临的各种恶劣条件,对产品进行高强度的测试。同时,根据产品的使用要求,合理预测其使用寿命。老化测试是为了确保产品达到满意的合格率,几乎所有产品在出厂前都必须经过

热文推荐