JFormattedTextField 仅返回默认值

Posted

技术标签:

【中文标题】JFormattedTextField 仅返回默认值【英文标题】:JFormattedTextField returns default value only 【发布时间】:2021-02-04 16:33:02 【问题描述】:

我将一个 JFormattedTextField(用 NumberFormatter 实例化并给定一个初始随机值)放在一个面板中,该面板进入一个 JOptionPane 并显示出来。然后,当我在该 JFormattedTextField 中键入不同的随机值并单击“确定”时,JFormattedTextField 返回原始值,而不是刚刚键入的值?!下面的最小代码示例。希望你能帮忙。

import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JFormattedTextField;
import javax.swing.JOptionPane;
import javax.swing.text.NumberFormatter;
import java.awt.*;

public class Weg 
    public static void main(String[] args) 
        final NumberFormatter numberFormatter = new NumberFormatter();
        numberFormatter.setMinimum(0);
        numberFormatter.setMaximum(Double.POSITIVE_INFINITY);

        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(1, 2));

        panel.add(new JLabel("Enter positive value:"));
        JFormattedTextField textField = new JFormattedTextField(numberFormatter);
        textField.setPreferredSize(new Dimension(70, 1));
        textField.setValue(999.1); //Random initial value
        panel.add(textField);

        panel.setPreferredSize(new Dimension(250, 35));
        int result = JOptionPane.showConfirmDialog(null, panel, "Enter a value", JOptionPane.OK_CANCEL_OPTION);
        if (result == JOptionPane.OK_OPTION) 
            double val = (double) textField.getValue();
            System.out.println("Value entered = " + val); //Whatever you enter, the old 999.1 is returned here???
        
    

【问题讨论】:

阅读 How to Use Formatted Text Fields 上的 Swing 教程中的部分以获取工作示例。 感谢您指出该教程。不过,它并不能帮助我解决我的问题。我什至尝试添加 textField.commitEdit(); (在尝试/捕获中),但这也无济于事。所以我还是卡住了…… 我使用教程作为参考来比较您如何创建格式化文本字段以及教程如何创建格式化文本字段。我使用了教程方法,效果很好。 太棒了。你能分享你的代码吗?谢谢... 我确实分享了代码。我说教程中的代码工作正常。以身作则。它的两行代码使用格式化的文本字段。您创建 NumberFormat 并使用它来创建 JFormattedTextField。 【参考方案1】:

我使用您发布的问题代码。

按原样进行测试时,我看到了您描述的问题。那就是我:

    删除前 9 个 标签 点击确定

结果:

    999.1 仍显示在格式化文本字段中 Value entered = 999.1 显示在控制台上。

然后我进行以下更改:

//numberFormatter.setMinimum(0);
//numberFormatter.setMaximum(Double.POSITIVE_INFINITY);

并重复上述 3 步,结果如下:

    99.1 显示在格式化文本字段中 Value entered = 99.1 显示在控制台上。

所以它按预期工作。

接下来我试试:

numberFormatter.setMinimum(0);
//numberFormatter.setMaximum(Double.POSITIVE_INFINITY);

然后重复这 3 个步骤,结果如下:

    99 显示在格式化文本字段中 获取异常:class java.lang.Integer cannot be cast to class java.lang.Double

所以我意识到最小值被创建为 Integer,而不是 Double 所以我尝试:

numberFormatter.setMinimum( Double.valueOf(0) );
//numberFormatter.setMaximum(Double.POSITIVE_INFINITY);

结果:

    99.1 显示在格式化文本字段中 Value entered = 99.1 显示在控制台上。

所以它按预期工作。

最后我试试:

numberFormatter.setMinimum( Double.valueOf(10) );
//numberFormatter.setMaximum(Double.POSITIVE_INFINITY);

并删除前两位数字,因此只显示“9.1”,结果:

    999.1 显示在格式化文本字段中 Value entered = 999.1 显示在控制台上。

遵守最小值并且代码按预期工作。

我不知道你为什么要尝试设置最大值,因为这显然是默认值。

这是您一次一步进行基本调试的方法。关键是首先通过一次进行一个更改来隔离问题。

【讨论】:

+1谢谢 - 现在情况好多了,但......仍然不像我希望的那样,因为用户可以输入负值并单击“确定”。然后用户可能会认为在随后的逻辑中使用了负值。而在幕后使用文本字段中的默认值...

以上是关于JFormattedTextField 仅返回默认值的主要内容,如果未能解决你的问题,请参考以下文章

JFormattedTextField 和 NumberFormat 与 Float 一起使用

如何从 JformattedTextfield 检索货币格式值

JFormattedTextField 接受不同的位数

具有任意小数位数的 JFormattedTextfield

为 JFormattedTextField 分配一个浮点数

在 JFormattedTextField 中禁用哔声