使用NumberFormat

时间:2019-02-25 13:42:56

标签: java swing number-formatting jformattedtextfield

我有这样的数字格式:

NumberFormat format = NumberFormat.getInstance();

以及格式化的文本字段:

JFormattedTextField score = new JFormattedTextField(format)

然后在我的代码中:

score.addFocusListener(new FocusListener() {                

@Override
public void focusLost(FocusEvent e) {
    }

@Override
public void focusGained(FocusEvent e) {
    if (someValue >= 0)
        score.setText(Integer.toString(someValue));
    else
        score.setText("");
    }
});

仅当值> = 0时,我才尝试转换分数文本字段的输入,如果不保留为空。该代码无法正常工作,实际上,如果我尝试保存一个正值(例如4),那么我会尝试将其更改为负值,这将无法正常工作。

有没有办法做到这一点?我想显示所有> = 0的值,但“隐藏”负值,所以说-5就像转换为空值。

编辑:
正如Prasad Karunagoda所建议的那样,我尝试使用NumberFormmater,但我无法处理一种情况:

我在FocusGained方法中有if语句来检查someValue il> = 0,如果是,则设置文本。在用户可以对其进行编辑之前,我已经将值预设为-1,因此第一次可以正常使用。现在说用户修改了文本并设置了一个有效的数字(格式化程序将Prasad Karunagoda建议的Minimum属性再次设置为0),说5,就很好了。

现在,我有一个将someValue重置为-1的按钮,因此,当用户输入要修改的文本时,文本的值为5(用户输入的最后一个有效数字)。我想要的是在按下按钮后将someValue重置为-1而不显示旧值,将文本设置为空,这可能吗?

1 个答案:

答案 0 :(得分:0)

您可以通过使用JFormattedTextField并将其最小值设置为0来使NumberFormatter拒绝负数。请尝试以下示例。

import javax.swing.*;
import javax.swing.text.NumberFormatter;
import java.awt.GridLayout;

public class FieldRangeTest {

  public static void main(String[] args) {

    NumberFormatter formatter = new NumberFormatter();
    formatter.setMinimum(0);
    JFormattedTextField formattedTextField = new JFormattedTextField(formatter);

    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(new GridLayout(2, 2));
    frame.getContentPane().add(new JLabel("Formatted text field"));
    frame.getContentPane().add(formattedTextField);
    frame.getContentPane().add(new JLabel("Text field"));
    frame.getContentPane().add(new JTextField(20));
    frame.setBounds(300, 200, 400, 300);
    frame.setVisible(true);
  }
}