JFormattedTextField returns 仅默认值
JFormattedTextField returns default value only
我在面板中放置了一个 JFormattedTextField(用 NumberFormatter 实例化并给出了一个初始随机值),然后该面板进入了一个 JOptionPane 并显示出来。当我在 JFormattedTextField 中键入一个不同的随机值并单击确定时,JFormattedTextField returns 原始值,而不是刚刚输入的值?!下面的最小代码示例。希望能帮到你。
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???
}
}
}
我使用你在问题中发布的代码。
按原样进行测试后,我看到了您描述的问题。那就是我:
- 已删除前 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
所以我意识到最小值被创建为整数,而不是双精度,所以我尝试:
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
显示在控制台上。
遵守了最小值并且代码按预期工作。
我不知道你为什么要尝试设置最大值,因为这显然是默认值。
这就是您一次一步进行基本调试的方式。重点是首先通过一次进行一个更改来隔离问题。
我在面板中放置了一个 JFormattedTextField(用 NumberFormatter 实例化并给出了一个初始随机值),然后该面板进入了一个 JOptionPane 并显示出来。当我在 JFormattedTextField 中键入一个不同的随机值并单击确定时,JFormattedTextField returns 原始值,而不是刚刚输入的值?!下面的最小代码示例。希望能帮到你。
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???
}
}
}
我使用你在问题中发布的代码。
按原样进行测试后,我看到了您描述的问题。那就是我:
- 已删除前 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
所以我意识到最小值被创建为整数,而不是双精度,所以我尝试:
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
显示在控制台上。
遵守了最小值并且代码按预期工作。
我不知道你为什么要尝试设置最大值,因为这显然是默认值。
这就是您一次一步进行基本调试的方式。重点是首先通过一次进行一个更改来隔离问题。