1 java swing number-formatting jformattedtextfield
我在JFrame上需要这样一个数字文本字段
我尝试使用JFormattedTextField:
NumberFormat nf = NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(2);
NumberFormatter numFormater = new NumberFormatter(nf);
field1 = new javax.swing.JFormattedTextField(numFormater);
Run Code Online (Sandbox Code Playgroud)
但是,格式限制仅在焦点离开组件时适用,这是一个问题.我希望用户能够在字段中仅键入数字和分隔符,并在字段中输入每个3-d数字后立即放置空格分隔符.
我只能通过指定字段的属性在C#中执行此操作.什么是在Swing中做到这一点的干净方法?谢谢.
其中一种方法是使用InternationalFormatter其他Formatter方法Number or DecimalFormatter
在每一个限制JFormattedTextField有副作用,为用户输入,例如Caret,Selection等等.
适当的方法可以是组合的使用DocumentFilter与DocumentListener加入到JFormattedTextField带滑动Number or DecimalFormatter,没有任何限制,所有的解决办法将被在两个设置DocumentFilter(指定为内变化Document)与DocumentListener(文档以外)
例如提到 InternationalFormatter
import java.awt.*;
import java.math.*;
import java.text.*;
import javax.swing.*;
import javax.swing.JFormattedTextField.AbstractFormatter;
import javax.swing.JFormattedTextField.AbstractFormatterFactory;
import javax.swing.text.InternationalFormatter;
public class DocumentListenerAdapter {
public DocumentListenerAdapter() {
JFrame frame = new JFrame("AbstractTextField Test");
final JFormattedTextField textField1 = new JFormattedTextField(new Float(10.01));
textField1.setFormatterFactory(new AbstractFormatterFactory() {
@Override
public AbstractFormatter getFormatter(JFormattedTextField tf) {
NumberFormat format = DecimalFormat.getInstance();
format.setMinimumFractionDigits(2);
format.setMaximumFractionDigits(2);
format.setRoundingMode(RoundingMode.HALF_UP);
InternationalFormatter formatter = new InternationalFormatter(format);
formatter.setAllowsInvalid(false);
formatter.setMinimum(0.0);
formatter.setMaximum(1000.00);
return formatter;
}
});
NumberFormat numberFormat = NumberFormat.getNumberInstance();
numberFormat.setMaximumFractionDigits(2);
numberFormat.setMaximumFractionDigits(2);
numberFormat.setRoundingMode(RoundingMode.HALF_UP);
final JFormattedTextField textField2 = new JFormattedTextField(numberFormat);
textField2.setValue(new Float(10.01));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(textField1, BorderLayout.NORTH);
frame.add(textField2, BorderLayout.SOUTH);
frame.setVisible(true);
frame.pack();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new DocumentListenerAdapter();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
例如JSpinner(编辑器是JFormattedTextField),具有非常简单的DocumentFilter