JFormattedTextField 未正确清除

2024-03-29

我正在做这个作业,制作一个解决数独的程序。我有一个带有 SudokuTextBox 网格扩展 JFormattedTextField 的面板。我有一个 MaskFormatter,因此每个文本框只接受一个整数。 然后在我的面板中,当释放按键时,我会看到此代码。

 public void keyReleased(KeyEvent e) {
  SudokuTextBox tb = (SudokuTextBox) e.getSource();
  int row = tb.getRow();
  int col = tb.getCol();
  int value = toInteger(tb.getText());
  //System.out.println(value);
  if(sudoku.isValid(row, col, value)) {
   sudoku.set(row, col, value);
  }
  else {
   sudoku.set(row, col, 0);
   tb.setText(null);
  }
  tb.setCaretPosition(0);
  sudoku.print();
 }

问题是,如果我在文本框中输入有效值,然后我返回并输入无效值(根据数独规则),文本框将被清除。但是,当我向前移动时,前一个有效值将显示在文本框中。 我的数独矩阵包含已输入的所有数字,它会像应有的那样清除该值,因此它仅位于相应的文本框中。

让事情变得更加混乱的是,当我将“SudokuTextBox extends JFormattedTextField”更改为“SudokuTextBox extends JTextField”时,它就像一个魅力。但我无法将 JTextField 的大小设置为正方形,并且我无法强制每个文本框仅使用一个整数。

我是否遗漏了一些非常明显的东西?


下面是一个可能适合此类游戏的可调整大小组件的示例。尽管它不包含游戏逻辑,但它可以很好地处理输入。单击鼠标或按空格键会弹出一个菜单,制表符和数字键按预期工作。尤其,Digit.EMPTY是一个有效值。

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.util.EnumSet;
import javax.swing.*;

/** @see http://stackoverflow.com/questions/4148336 */
public class CellTest extends JPanel {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            //@Override
            public void run() {
                createGUI();
            }
        });
    }

    public static void createGUI() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new GridLayout(3, 3));
        for (Digit d : Digit.digits) {
            frame.add(new CellTest(d));
        }
        frame.pack();
        frame.setVisible(true);
    }

    CellTest(Digit digit) {
        this.setLayout(new BorderLayout());
        this.setBorder(BorderFactory.createLineBorder(Color.black, 1));
        this.setBackground(new Color(0x00e0e0));

        JLabel candidates = new JLabel("123456789");
        candidates.setHorizontalAlignment(JLabel.CENTER);
        this.add(candidates, BorderLayout.NORTH);

        JDigit cellValue = new JDigit(digit);
        add(cellValue, BorderLayout.CENTER);
    }
}

class JDigit extends JButton {

    private static final int SIZE = 128;
    private static final int BASE = SIZE / 32;
    private static final Font FONT = new Font("Serif", Font.BOLD, SIZE);
    private JPopupMenu popup = new JPopupMenu();
    private Digit digit;
    private Image image;
    private int width, height;

    public JDigit(Digit digit) {
        this.digit = digit;
        this.image = getImage(digit);
        this.setPreferredSize(new Dimension(64, 64));
        this.setBackground(new Color(0xe0e000));
        this.setForeground(Color.black);
        this.setBorderPainted(false);
        this.setAction(new ButtonAction());
        this.addFocusListener(new FocusHandler());
        for (Digit d : Digit.values()) {
            Action select = new SelectAction(d);
            JMenuItem item = new JMenuItem(select);
            getInputMap().put(KeyStroke.getKeyStroke(
                KeyEvent.VK_0 + d.value(), 0), d.toString());
            getInputMap().put(KeyStroke.getKeyStroke(
                KeyEvent.VK_NUMPAD0 + d.value(), 0), d.toString());
            getActionMap().put(d.toString(), select);
            popup.add(item);
        }
    }

    public Digit getDigit() {
        return digit;
    }

    public void setDigit(Digit digit) {
        this.digit = digit;
        this.image = getImage(digit);
        this.repaint();
    }

    @Override
    protected void paintComponent(Graphics g) {
        int w = this.getWidth();
        int h = this.getHeight();
        g.setColor(this.getBackground());
        int dx1 = w * width / height / 4;
        int dx2 = w - dx1;
        g.fillRect(dx1, 0, dx2 - dx1, h);
        g.drawImage(image,
            dx1, 0, dx2, h,
            0, 0, width, height, null);
    }

    private Image getImage(Digit digit) {
        BufferedImage bi = new BufferedImage(
            SIZE, SIZE, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = bi.createGraphics();
        g2d.setRenderingHint(
            RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setColor(this.getForeground());
        g2d.setFont(FONT);
        FontMetrics fm = g2d.getFontMetrics();
        width = fm.stringWidth(digit.toString());
        height = fm.getAscent();
        g2d.drawString(digit.toString(), 0, height - BASE);
        g2d.dispose();
        return bi;
    }

    private class ButtonAction extends AbstractAction {
        //@Override
        public void actionPerformed(ActionEvent e) {
            popup.show(JDigit.this, getWidth() - width, getHeight() / 2);
        }
    }

    private class SelectAction extends AbstractAction {

        private Digit digit;

        public SelectAction(Digit digit) {
            this.digit = digit;
            this.putValue(Action.NAME, digit.toString());
        }

        //@Override
        public void actionPerformed(ActionEvent e) {
            setDigit(digit);
        }
    }

    private class FocusHandler implements FocusListener {

        private Color background = getBackground();

        //@Override
        public void focusGained(FocusEvent e) {
            setBackground(background.brighter());
        }

        //@Override
        public void focusLost(FocusEvent e) {
            setBackground(background);
        }
    }
}

enum Digit {

    EMPTY(0, " "), ONE(1, "1"), TWO(2, "2"), THREE(3, "3"), FOUR(4, "4"),
    FIVE(5, "5"), SIX(6, "6"), SEVEN(7, "7"), EIGHT(8, "8"), NINE(9, "9");
    public static EnumSet<Digit> digits = EnumSet.range(Digit.ONE, Digit.NINE);
    private int i;
    private String s;

    Digit(int i, String s) {
        this.i = i;
        this.s = s;
    }

    @Override
    public String toString() {
        return s;
    }

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

JFormattedTextField 未正确清除 的相关文章

  • war文件可以部署在任何服务器上吗?

    如果这个问题很愚蠢 请原谅我 假设我使用 Spring 框架和 MS SQL Server 数据库以及 WebSphere 应用程序服务器开发一个 J2EE Web 应用程序 我后来为此应用程序创建了一个 WAR 文件 我可以在不更改代码的
  • 区域设置的 Java 日期格式

    我怎样才能找到DateFormat对于给定的Locale DateFormat getDateInstance int Locale 例如 import static java text DateFormat DateFormat f ge
  • 使用递归查找数组中的最大值

    对于我被要求解决的问题之一 我使用 for 循环找到了数组的最大值 所以我尝试使用递归来找到它 这就是我想到的 public static int findMax int a int head int last int max 0 if h
  • 在进行字符识别之前使用 OpenCV 进行图像预处理(超正方体)

    我正在尝试开发简单的 PC 应用程序用于车牌识别 Java OpenCV Tess4j 图像不是很好 进一步它们会很好 我想对超立方体图像进行预处理 但我被困在车牌检测 矩形检测 上 我的步骤 1 源图像 Mat img new Mat i
  • 比 O(n) 更好的范围交集算法?

    范围交集是一个简单但不平凡的问题 已经回答过两次了 查找数字范围交集 https stackoverflow com questions 224878 find number range intersection 比较日期范围 https
  • JUnit 测试 Spymemcached 客户端

    我有一个类围绕spymemcached 客户端 我想编写一些JUnit 测试来测试getValue 和addKey 方法是否有效 问题是无法从测试服务器访问spymemcached 服务器 所以我想这里需要一些模拟 我的简化类看起来像这样
  • 字符串文字的行为令人困惑

    下面的代码中字符串文字的行为非常令人困惑 我可以理解第 1 行 第 2 行和第 3 行是true 但为什么是第 4 行false 当我打印两者的哈希码时 它们是相同的 class Hello public static void main
  • “找不到符号”或“无法解析符号”错误是什么意思?

    请解释以下有关 找不到符号 无法解析符号 或 找不到符号 错误 Java 中 的信息 他们的意思是什么 哪些因素会导致它们 程序员如何修复它们 这个问题旨在对 Java 中的这些常见编译错误进行全面的问答 0 这些错误之间有什么区别吗 并不
  • Hibernate 在更新集合时删除孤儿

    我发现从 Hibernate 中的集合中删除时 孤立记录不会被删除 我一定是做了一些简单的错误 这是 Hibernate 101 但我找不到它 鉴于以下情况 public class Book ManyToOne NotNull Autho
  • 在 Java 中从 Json 字符串中提取字段

    我正在尝试从以下 Json 字符串中提取每个 company id 的 id String test company id 4100 data drm user id 572901936637129135 direct status id
  • LDAP中超时的实现

    我一直在处理我们正在使用的应用程序LDAP获取用户详细信息 有时获取用户详细信息需要更多时间 我想实施time out获取详细信息的方法 以便我们可以避免在最坏的情况下在服务器中挂起事务 这里我们使用的是LdapUtil我们在其中配置的类L
  • 如何使用 Java 以编程方式登录 Facebook?

    我正在尝试编写一个可以自动登录 Facebook 的 Java 程序 到目前为止 我已经得到了以下代码 可以将主页 html 页面下载到字符串中 但不知道如何发送电子邮件和密码来登录 Facebook Java 程序还需要处理返回的 coo
  • Java HashSet 具有自定义相等标准? [复制]

    这个问题在这里已经有答案了 我一直在寻找类似于 Java TreeSet 在实例化时接收自定义比较器的能力 因此我不需要使用对象的默认相等 和哈希码 标准 我能想到的最接近的方法是将我的对象包装在一个私有的自定义类中 但这看起来很老套 这最
  • 将 JSON 与嵌套数组和 json 进行比较(数组顺序无关紧要)

    你好 我正在尝试比较java中的两个json 每个键可以包含一个json对象或json对象数组 并且它们中的每个也可以是数组或json 这是 Json 的示例 id 123123asd123 attributes name apps val
  • 可以将矩形设置为显示边框吗?

    以下应用 public class Temp extends Application Override public void start Stage primaryStage StackPane root new StackPane Re
  • 如何获取eclipse中的工作空间路径? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在研究PDE Eclipse Plugin Project 我需要获取工作区路径 我的文本小部件 swt 应该设置为当前工作空间路径 如
  • 如何在pdf中导出一对一的JTable[重复]

    这个问题在这里已经有答案了 可能的重复 为什么 JTable 标题没有出现在图像中 https stackoverflow com questions 7369814 why does the jtable header not appea
  • Java - 全局、可重用的加载对话框

    我正在尝试实现一个全局加载对话框 我想调用一些静态函数来显示对话框和一些静态函数来关闭它 与此同时 我正在主线程或子线程中做一些工作 我尝试以下操作 但对话框没有更新 最后一次 在再次隐藏之前 它会更新 private static Run
  • Java 压缩字符串

    我需要创建一个接收字符串并返回字符串的方法 防爆输入 AAABBBCCC 防爆输出 3A4B2C 好吧 这很尴尬 我在今天的面试中无法做到这一点 我正在申请初级职位 现在 我在家尝试制作一些静态工作的东西 我的意思是 不使用循环有点无用 但
  • 你在实际项目中使用过Quickcheck吗[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 快速检查 http www cs chalmers se rjmh QuickCheck 及其变体 即使有一个Java https bitbuc

随机推荐

  • 为什么 CSS Grid 的自动填充属性在列方向上不起作用

    我正在练习用行自动填充属性 但是 它并没有按照我的意愿进行 我想创建具有高度的行minmax 140px 200px 而是获取一行高度为 200px 的行 其余行为 18px 为什么会发生这种情况 body html height 100
  • 使用ajax上传文件到远程服务器

    我对服务器端没有任何控制权 是否可以在 Iframe 中上传并加载远程服务器给出的结果 请分享一些代码 谢谢 使用名称声明 iframe 并在表单元素中定位该名称
  • 调整大小和滚动问题(JS/HTML)

    有两个容器 第一个是小视口 第二个是巨大的工作区 因此 用户滚动视口以在工作区中移动 我想通过 CSS 属性实现放大 缩小功能tranform 但是在这个过程中我遇到了一个难题 并没有找到精确的解决方案 问题是 当用户放大 缩小时 工作区中
  • 带有 @MappedSuperclass 的 Hibernate TABLE_PER_CLASS 不会创建 UNION 查询

    我正在尝试创建一系列对象 这些对象全部存储在单独的表中 但所有这些表上都有一组共同的字段 我希望 Hibernate 对所有这些表进行 UNION 但不包括超类作为表 当我用以下方式注释超类时 MappedSuperclass Inheri
  • 插入、删除、最大值 O(1)

    有人能告诉我哪种数据结构支持 O 1 的插入 删除 最大操作吗 这是一个经典的面试问题 通常是这样提出的 设计一个类似堆栈的数据结构 在 O 1 时间内执行压入 弹出和最小 或最大 操作 没有空间限制 答案是 您使用两个堆栈 主堆栈和最小
  • 在 n 维数组上使用 scipy interpn 和 meshgrid

    我正在尝试翻译大型 4D 数组的 Matlab interpn 插值 但 Matlab 和 Python 之间的公式存在显着差异 几年前有一个很好的问题 答案here https stackoverflow com questions 39
  • 如何删除R中第n个分隔符之后的所有内容?

    我有这个向量myvec 我想删除第二个 之后的所有内容并得到结果 如何删除第 n 个 之后的字符串 myvec lt c chr2 213403244 213403244 G T snp chr7 55240586 55240586 T G
  • JA017:无法查找已启动的 hadoop 作业 ID

    当我在Hue的Oozie编辑器中提交mapreduce作业时 如何解决这个问题 JA017 无法查找与操作 0000009 150711083342968 oozie root W mapreduce f660 关联的已启动 hadoop
  • WordPress 数据库中的附加表

    我正在使用 WordPress 我想为我的网站开发更多服务 我正在考虑在 WordPress 数据库中创建新表 这种方法行得通吗 我不希望 WordPress 在更新等时删除我的表 这些服务将位于单独的页面上 它们不会是 WordPress
  • 如何在每次数据变化时刷新kivy RecycleView?

    我正在尝试创建一个简单的考勤应用程序 程序启动时 所有标签都在取消选择列表中 预期行为 当选择任何标签时 数据将移动到所选列表 现在所选标签位于连接列表的末尾 然后 RecycleView 刷新以显示此更改 所以我设法使数据从一个列表移动到
  • 如何使用GTK开发类似Eclipse的界面?

    我想使用 GTKMM 编写一个桌面应用程序 我希望界面由不同的面板组成 就像在 Eclipse 中一样 您有项目资源管理器 控制台 属性等 您应该能够拖动面板来更改其位置 关闭它们并弹出它们 不确定是否可以弹出 Eclipse 中的面板 但
  • 有人知道针对低内存使用进行优化的 java.util.Map 实现吗?

    我查看了通常的地方 apache commons google 但找不到一个 它应该是开源的 几乎正在寻找一个基于链接列表的 用例是 10 000 张地图 不一定有很多值 它不需要按比例放大 因为当它变得太大时我可以转换它 一些数字 大小使
  • RecyclerView SnapHelper 无法显示第一个/最后一个项目

    我有一个RecyclerView它附加到一个LinearSnapHelper捕捉到中心项目 当我滚动到第一个或最后一个项目时 这些项目不再完全可见 此问题如下图所示 怎么解决呢 一个迟到的答案只是用Java代码编写的 Create Cust
  • 如何将 Angular 应用程序部署到 Heroku 并保持为 PWA? [复制]

    这个问题在这里已经有答案了 总结一下问题 我正在尝试将我的 Angular 6 应用程序部署到 Heroku 并保留渐进式 Web 应用程序功能 Heroku 上的最终构建没有 Service Worker 背景 我已经在 Angular
  • Jodatime 是否有方法获取自某个较旧日期以来的月份和日期?

    我想确切地知道某个较早的日期距离今天有多少个月和天 可能是几年 有没有办法做到这一点 我知道如何获得月份的差异 我知道如何获得天数的差异 但我无法获得月份和日期 Ex 旧 2013 03 04 现在 2013 04 17 所以我寻找的结果类
  • Mingw-w64“无法下载repository.txt”错误

    我正在尝试在 Windows 7 中安装 MinGW w64 但我不断收到错误 无法下载repository txt 我已阅读有关此问题的多个线程并下载了多个 exe 文件 但它们都不适合我 我的 MATLAB R2016a 存在使用附加组
  • Java Logger:创建以轮转数+.log为后缀的文件

    我正在使用 java util logging 包中的 Java Logger 这就是我当前创建记录器的方式 FileHandler fileHandler new FileHandler filePath 5242880 5 true f
  • Angular2访问父组件的@input值

    我正在尝试使用 ComponentResolver 和 ViewContainerRef 服务动态加载组件 子组件加载正常并且模板已渲染 但是我想访问子组件内父级 字段 和 值 的输入 任何帮助将非常感激 父组件 import Compon
  • 如何在 Scala 中使用 >=> ?

    我正在尝试使用 gt gt Kleisli 箭头 在 Scala 中 据我了解 它由返回单子的函数组成 现在我正在尝试如下 scala gt val f i Int gt Some i 1 f Int gt Some Int
  • JFormattedTextField 未正确清除

    我正在做这个作业 制作一个解决数独的程序 我有一个带有 SudokuTextBox 网格扩展 JFormattedTextField 的面板 我有一个 MaskFormatter 因此每个文本框只接受一个整数 然后在我的面板中 当释放按键时