如何在 Java Swing for Hangman 游戏中获取从侦听器更新的文本字段?

2024-01-13

我正在尝试从 Hangman 程序编写代码。我不确定这个想法是否正确。我正在考虑在文本字段中添加破折号(_ _ _ _ _),当用户按下按钮时,该破折号必须动态更改。例如,如果用户按下下面代码中的“A”按钮,则破折号应更改为 (A _ _ _ _ )。即用户猜对了字母A。

我仍然对如何实现这一点感到困惑。附加事件监听器将是我的下一部分。 但现在,我必须让基本的 GUI 正常工作,为此我需要了解如何实现整个事情。

让它发挥作用的更好方法是什么? 这是我现在的代码。

import javax.swing.*;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridLayout;
import java.awt.event.*;
import java.awt.image.BufferedImage;

public class HangmanGUI {

public HangmanGUI() {
    JFrame myframe= new JFrame();
    myframe.getContentPane().setLayout(new BorderLayout());
    JPanel myPanel = new JPanel();
    myPanel.setLayout(new GridLayout(2,15));
    myframe.setSize(600,600);

    for (char alphabet = 'A';alphabet<='Z';alphabet++){
        myPanel.add(new JButton(alphabet+""));
    }

    myframe.getContentPane().add(myPanel, BorderLayout.SOUTH);
    myframe.setTitle("Hangman Game");
    myframe.setVisible(true);
    myframe.setLocationRelativeTo(null);
    myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

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

您可以利用DocumentFilterAPI 允许您实时过滤来自用户的传入结果。

这个示例有点棘手,因为它隐藏了插入符号,因此它允许文本以您想要的任何顺序显示。

For example, the example uses Duck as the secret (the algorithm is case insensitive). If the user types c then the field will appear as __c_. Of course, you could just simply insert the incoming character in the what ever position was next, but where's the fun in that.

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.Point;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.ChangeListener;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Caret;
import javax.swing.text.DefaultCaret;
import javax.swing.text.DocumentFilter;
import javax.swing.text.JTextComponent;

public class HangManField {

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

    public HangManField() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private String secret = "Duck";
        private String guesses = secret;

        public TestPane() {

            setLayout(new GridBagLayout());

            Caret blank = new DefaultCaret() {

                @Override
                public void paint(Graphics g) {
                }

                @Override
                public boolean isVisible() {
                    return false;
                }

                @Override
                public boolean isSelectionVisible() {
                    return false;
                }

            };

            JTextField field = new JTextField("____");
            field.setCaretPosition(0);
            field.setCaret(blank);
            ((AbstractDocument) field.getDocument()).setDocumentFilter(new DocumentFilter() {

                @Override
                public void insertString(DocumentFilter.FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {

                    replace(fb, offset, offset, string, attr);

                }

                @Override
                public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
                    System.out.println("rplace");
                    StringBuilder sb = new StringBuilder(guesses.toLowerCase());
                    for (int index = 0; index < text.length(); index++) {
                        String at = text.substring(index, index + 1).toLowerCase();
                        int subIndex = sb.indexOf(at);
                        if (subIndex > -1) {
                            super.replace(fb, subIndex, 1, at, attrs);
                            sb.delete(index, index);
                        }
                    }
                }

                @Override
                public void remove(DocumentFilter.FilterBypass fb, int offset, int length) throws BadLocationException {
                    StringBuilder sb = new StringBuilder(length);
                    while (sb.length() < length) {
                        sb.append("_");
                    }
                    replace(fb, offset, length, sb.toString(), null);
                }
            });

            add(field);
        }
    }

}

该算法不做的事情是当前支持多个重复出现的字符,例如characters。不过,你不需要花太多时间就能完成这项工作;)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Java Swing for Hangman 游戏中获取从侦听器更新的文本字段? 的相关文章

  • Java将字符串解析为double

    如何解析字符串中的这个 Double 00034800 变成 Double 值 最后两位数字实际上是小数点 所以我正在寻找的结果是348 00 是否有这样的格式可以与十进制格式一起使用 Well String s 00034800 doub
  • “源兼容性”和“目标兼容性”有什么区别?

    之间有什么关系 区别sourceCompatibility and targetCompatibility 当它们设置为不同的值时会发生什么 根据工具链和兼容性 https docs gradle org current userguide
  • 如何在 Android 应用程序中隐藏 Flutterwave API 密钥

    我正在构建一个 Android 应用程序 目前正在将 Flutterwave 集成到我的应用程序中以进行支付 建议我永远不要将 Flutterwave API 密钥放在我的应用程序上 那么我该如何隐藏这些键呢 我正在使用 Retrofit
  • 为什么在 10 个 Java 线程中递增一个数字不会得到 10 的值?

    我不明白 a 的值为0 为什么 a 不是10 那段代码的运行过程是怎样的 是否需要从Java内存模型来分析 这是我的测试代码 package com study concurrent demo import lombok extern sl
  • 以相反的顺序打印任何集合中的项目?

    我在 使用 Java 进行数据结构和问题解决 一书中遇到以下问题 编写一个例程 使用 Collections API 以相反的顺序打印任何 Collection 中的项目 不要使用 ListIterator 我不会把它放在这里 因为我想让有
  • 通过Zuul上传大文件

    我在通过 zuul 上传大文件时遇到问题 我正在使用 apache commons 文件上传 https commons apache org proper commons fileupload https commons apache o
  • 无法使用 datastax java 驱动程序通过 UDT 密钥从 cassandra 检索

    我正在尝试使用用户定义的类型作为分区键将对象存储在 cassandra 中 我正在使用 datastax java 驱动程序进行对象映射 虽然我能够插入到数据库中 但无法检索该对象 如果我更改分区键以使用非 udt 例如文本 我就能够保存和
  • 未装饰窗户的 Windows Snap 功能?

    有谁知道如何允许未装饰的窗户使用此功能 唯一的选择就是重新实施它 有任何想法吗 谢谢 可停靠可能是唯一的JToolBar http docs oracle com javase tutorial uiswing components too
  • getCurrentSession 在网络中休眠

    我正在使用 hibernate 和 jsp servlet 编写一个基于 Web 的应用程序 我读过有关sessionFactory getCurrentSession and sessionFactory openSession方法 我知
  • Java AES 256 加密

    我有下面的 java 代码来加密使用 64 个字符密钥的字符串 我的问题是这会是 AES 256 加密吗 String keyString C0BAE23DF8B51807B3E17D21925FADF273A70181E1D81B8EDE
  • ThreeTen 向后移植与 JSR-310 的比较

    由于某些原因 我们现在无法使用 java 8 我们仍然停留在 java 7 上 不过 我想使用新的JSR 310 date time APIs现在 使用官方向后移植 ThreeTen http www threeten org threet
  • 使用 Proguard 通过 Dropbox.com 库混淆 Android 应用程序

    我刚刚创建了一个需要 Dropbox com API 库的 Android 应用程序 我现在尝试在 发布 模式下构建应用程序 并希望在代码上运行混淆器以对其进行混淆 但是 每当我尝试运行 Proguard 时 都会收到以下错误 Progua
  • Joshua Bloch 的构建器设计模式有何改进?

    早在 2007 年 我就读过一篇关于 Joshua Blochs 所采用的 构建器模式 的文章 以及如何修改它以改善构造函数和 setter 的过度使用 特别是当对象具有大量属性 其中大部分属性是可选的 时 本文对此设计模式进行了简要总结
  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A
  • Azure Java SDK:ServiceException:ForbiddenError:

    尝试了基本位置检索器代码 如下所示 String uri https management core windows net String subscriptionId XXXXXXXX 5fad XXXXXX 9dfa XXXXXX St
  • java实现excel价格、收益率函数[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Android计算两个日期之间的天数

    我编写了以下代码来查找两个日期之间的天数 startDateValue new Date startDate endDateValue new Date endDate long diff endDateValue getTime star
  • 在 Java 中通过 D-Bus MPRIS 访问 Clementine 实例

    我使用 Clementine 作为音乐播放器 它可以通过 D Bus 命令进行控制 在命令行上 使用 qdbus 我可以 Start Stop 暂停播放器 强制它跳过播放列表中的歌曲 检查播放列表的长度 检查播放列表中当前播放的曲目及其元数
  • Selenium 单击在 Internet Explorer 11 上不起作用

    我尝试在 Internet Explorer 上单击 selenium 但它不起作用 我努力了element click moveToElement element click build perform javascript没事了 事实上
  • 设置 TreeSet 的大小

    有没有办法像数组一样对 Java 集合中的 TreeSet 进行大小限制 例如我们在数组中 anArray new int 10 数组具有固定长度 在创建数组时必须指定该长度 A TreeSet当您向其中添加元素时会自动增长 您无法设置其大

随机推荐

  • Excel 无法在 angularjs 中正确生成

    我在用angularjs并在filesaver js的帮助下使用blob生成excel表我得到了正确的结果 但excel无法在Micrsoft Excel中正确打开 它正在工作 但我没有得到单元格 它显示黑白页面 但内容在那里 帮助如何解决
  • 单元测试 MockHttpServletRequest 不返回内容类型

    我希望应用程序从我的 Java 类返回 JSON 对象 成功和失败情况 我定义了一个 RestControllerAdvice处理来自控制器的错误 我的程序也在json中正确显示错误消息 但问题出在单元测试 问题是当它抛出时 org spr
  • 在没有 gcc 或 root 访问权限的共享主机上安装需要 gcc 的 python 模块

    我正在使用 Hostgator 共享作为生产环境 并且在使用以下命令后安装一些 python 模块时遇到问题 pip 安装 MySQL python 点安装枕头 结果是 无法执行 gcc 权限被拒绝 错误 命令 gcc 失败 退出状态为 1
  • Node/Express 的 MongoDB 示例 AJAX 调用?

    这是从一个非常基本的页面开始 HTML 表单 一个按钮和一个 div 框 单击按钮将通过 AJAX POST 表单数据 数据将存储在 MongoDB 中 并在不刷新页面的情况下检索到 div box 中 来自index html的AJAX
  • VMWare 如何防止虚拟机更新其日期和时间

    我想知道虚拟机 VMWare 如何更新其日期和时间以及如何禁用它 因为我注意到 即使我将虚拟机暂停 关闭一年 当我再次打开它时 它也会有正确的时间和日期 对于物理机 我知道主板上固定的中央单元内有一个小电池 有助于在计算机关闭并断开电源时保
  • Apache Zeppelin 0.6.1:运行 Spark 2.0 Twitter Stream 应用程序

    我有一个安装了 Spark 2 0 和 Zeppelin 0 6 1 的集群 自从上课以来TwitterUtils scala从 Spark 项目移至 Apache Bahir 我无法再在我的 Zeppelin 笔记本中使用 Twitter
  • C# 中实现相等性的最少代码

    In this Eric Lippert 在第 9 点中指出 C 具有 太多的平等性 他指出有 9 或 10 种不同的方法或运算符可以重载以提供对象相等性 我的第一个问题是 如果重写 Object Equals object 方法 编译器是
  • Linux 下 Java 的虚拟内存使用情况,使用了太多内存

    我在 Linux 下运行 Java 应用程序时遇到问题 当我使用默认最大堆大小 64 MB 启动应用程序时 我看到使用 tops 应用程序为该应用程序分配了 240 MB 虚拟内存 这会给计算机上的一些其他软件带来一些问题 而计算机的资源相
  • 调整标题大小 onscroll React

    我基本上需要在 React 中重写这个 codepen https codepen io lili2311 pen dJjuL https codepen io lili2311 pen dJjuL function resizeHeade
  • 伪随机数生成器给出相同的第一个输出,但随后表现如预期

    使用随机类和时间种子 NULL 均匀分布总是给出相同的第一个输出 即使使用不同的编译 但第一个输出之后的行为就像您期望的伪随机数生成器的行为一样 这是建筑造成的 还是我使用不当 MWE include
  • 在“ForEach”上引用初始值设定项“init(_:content:)”要求“Planet”符合“可识别”

    我目前正在构建一个 ios 应用程序 似乎有以下问题 Referencing initializer init content on ForEach requires that Planet conform to Identifiable
  • 适用于 Android 的 OpenGL ES 2.0 中的纹理

    我是 OpenGL 新手 我正在通过使用 ES 2 0 为 Android 制作 2D 游戏来自学 我首先创建一个 Sprite 类 该类创建一个平面并向其渲染纹理 为了练习 我有两个 Sprite 对象 它们在同一位置交替绘制 我在 ES
  • 普通用户无法读取/proc/net/dev

    我很确定我在这里遗漏了一些东西 但我不确定到底是什么 这是 root 可以看到的 root opteron16 ls l grep proc dr xr xr x 290 root root 0 2012 01 14 02 03 proc
  • Caddy - 在本地域上设置 HTTPS

    我想将 HTTPS 添加到我的本地域 但是我们无法在本地主机上执行此操作 当我使用此 Caddyfile 运行时 我的网站运行良好 localhost 2020 bind ADDRESS proxy http 192 168 100 82
  • Android中的ListView打开超链接

    有什么办法可以显示名称吗 TechCrunch Twit NASA 在列表视图中 当用户单击其中一个时 它应该打开一个意图 其中包含列出的相应网站的链接 任何想法表示赞赏 如果你不想要ListView由数据库生成 并且您希望将每个网站添加到
  • 无论如何将构造函数参数传递给 JAXB 适配器?

    我在我编写的 WebService 中使用 Spring 3 IOC 和 JAXB JAX WS 我现在遇到一个小问题 数据必须在返回给消费者之前进行四舍五入 因为它们无法处理值的完整精度 为了最大限度地减少对 WS 设计和计算的影响 我选
  • Eclipse:有没有办法快速导出JAR

    所以这可能看起来有点模糊 快 到底有多快等等 好吧 我只是想知道是否有一种方法可以比以下更快地导出 JAR 文件 File gt Export gt JAR File等等等等 就像我可以Ctrl Drag到资源管理器并导出项目标题和 jar
  • 删除继承的 ASP.NET Core 应用程序设置

    我的启动中有以下设置 var builder new ConfigurationBuilder AddJsonFile appsettings json true true AddJsonFile appsettings env Envir
  • Google Charts 堆叠了列,每个列都有不同的注释

    我希望你能帮助我解决这个问题 我有一个堆积柱形图 所有柱形图的每列中都有两个要堆积的值 我已经成功创建了图表 但我需要为每列的每一部分添加注释 我不知道它的正确名称 指示该部分在其自己的列中所代表的总数的百分比 在下面给出的示例中 我需要设
  • 如何在 Java Swing for Hangman 游戏中获取从侦听器更新的文本字段?

    我正在尝试从 Hangman 程序编写代码 我不确定这个想法是否正确 我正在考虑在文本字段中添加破折号 当用户按下按钮时 该破折号必须动态更改 例如 如果用户按下下面代码中的 A 按钮 则破折号应更改为 A 即用户猜对了字母A 我仍然对如何