JFormattedTextField 仅返回默认值

问题描述

我在面板中放置了一个 jformattedtextfield(用 NumberFormatter 实例化并给出了一个初始随机值),并且该面板进入了显示的 JOptionPane。当我在该 jformattedtextfield 中键入一个不同的随机值并单击 OK 时,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???
        }
    }
}

解决方法

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

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

  1. 删除了前 9 个
  2. 标签
  3. 点击确定

结果:

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

然后我进行了以下更改:

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

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

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

所以它按预期工作。

接下来我尝试:

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

并用结果重复 3 个步骤:

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

所以我意识到最小值被创建为整数,而不是双精度所以我尝试:

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

结果:

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

所以它按预期工作。

最后我尝试:

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

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

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

尊重最小值,代码按预期工作。

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

这是一次一步进行基本调试的方式。重点是首先通过一次进行一个更改来隔离问题。