Java:JFormattedTextField 保存数字 [英] Java : JFormattedTextField saving numbers
问题描述
在我的应用程序中,我想将数字(数量)输入到特定限制,因此使用了 JFormattedTextField.像12345678.99"这样的限制,即."之前的 8 位数字和."之后的 2 个等等.这是我的实现代码,但没有达到预期的效果.
In my application I want to input numbers (amounts) to a specific limit, and hence have used JFormattedTextField. Limit like "12345678.99" i.e. 8 digits before "." and 2 after "." or so on. This is my implementation code, but it doesn't result as expected.
startBalTxt.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter(new java.text.DecimalFormat("########.##"))));
startBalTxt.setText(resourceMap.getString("startBalTxt.text")); // NOI18N
startBalTxt.setFont(Utility.getTextFont());
startBalTxt.setName("startBalTxt"); // NOI18N
<小时>
INPUT RESULT
"12345678905.99" => "12345678906" ==> Should give "12345678.99" or "12345679.99"
"12345678.555" => "12345678.56" ==> CORRECT
"1234567890123456" => "1234567890123456" ==> Absolutely wrong in all aspects
我哪里出错了?以及如何使其按照我的预期工作.
Where am I going wrong ? And how to make this working as I am expecting it.
按照 StanislavL 的建议进行更新:
numberFormat = (DecimalFormat) DecimalFormat.getNumberInstance();
numberFormat.setMaximumFractionDigits(2);
numberFormat.setMaximumIntegerDigits(8);
numberFormat.setMinimumFractionDigits(0);
numberFormat.setMinimumIntegerDigits(2);
nfr = new NumberFormatter(numberFormat);
initComponents();
myParent = parent;
this.startBalTxt.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(nfr));
Results -> 4562147896.45 == > 62,147,896.45
它遵守的限制是正确的,但它消除了以前的数字而不是后来的数字.我的意思是在 4562147896.45 而不是 "45" "96" 不应该被淘汰.
Its obeying the limit that's true, but its eliminating previous numbers instead of later. I mean in 4562147896.45 instead of "45" "96" shouldn't be eliminated.
推荐答案
即使 JFormattedTextField
实现了 DecimalFormat
和 NumberFormat
,最好使用 <代码>文档监听器,
even JFormattedTextField
implements DecimalFormat
and NumberFormat
, better would be use DocumentListener
,
1) 通过使用 DecimalFormat
或 NumberFormat
简单的 User-non-Acceptable
在 Big Figures
之间跳转是不好的> 通过实现 setMinimum() 和 setMaximum()
1) its not good jumping betweens Big Figures
by using DecimalFormat
or NumberFormat
simple User-non-Acceptable
by implements setMinimum() and setMaximum()
2) JTextComponents
默认实现插入文本,然后任何解决方法都是 User-non-Acceptable
通过 implementsJFormattedTextField
和 >DecimalFormat
或NumberFormat
通过实现 setMinimum() 和 setMaximum()
2) JTextComponents
by default implements insert the text, then any workaround is so User-non-Acceptable
by implementsJFormattedTextField
with DecimalFormat
orNumberFormat
by implements setMinimum() and setMaximum()
3) 它非常舒适 je 使用 DocumentListener
允许添加任何数量,但突出显示超出范围
3) its very confortable je use DocumentListener
allows add any amount, but with highlighting out-off range
4) 或者使用 JSpinner
和 SpinnerNumberModel
,可以像 Number Instance 一样设置 Formatter
4) or use JSpinner
with SpinnerNumberModel
, there is posible to set Formatter as for Number Instance
InternationalFormatter
和 DocumentListener
的示例
import java.awt.*;
import java.awt.font.TextAttribute;
import java.math.*;
import java.text.*;
import java.util.Map;
import javax.swing.*;
import javax.swing.JFormattedTextField.*;
import javax.swing.event.*;
import javax.swing.text.InternationalFormatter;
public class DocumentListenerAdapter {
public static void main(String args[]) {
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;
}
});
final Map attributes = (new Font("Serif", Font.BOLD, 16)).getAttributes();
attributes.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON);
final JFormattedTextField textField2 = new JFormattedTextField(new Float(10.01));
textField2.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;
}
});
textField2.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void changedUpdate(DocumentEvent documentEvent) {
printIt(documentEvent);
}
@Override
public void insertUpdate(DocumentEvent documentEvent) {
printIt(documentEvent);
}
@Override
public void removeUpdate(DocumentEvent documentEvent) {
printIt(documentEvent);
}
private void printIt(DocumentEvent documentEvent) {
DocumentEvent.EventType type = documentEvent.getType();
double t1a1 = (((Number) textField2.getValue()).doubleValue());
if (t1a1 > 1000) {
Runnable doRun = new Runnable() {
@Override
public void run() {
textField2.setFont(new Font(attributes));
textField2.setForeground(Color.red);
}
};
SwingUtilities.invokeLater(doRun);
} else {
Runnable doRun = new Runnable() {
@Override
public void run() {
textField2.setFont(new Font("Serif", Font.BOLD, 16));
textField2.setForeground(Color.black);
}
};
SwingUtilities.invokeLater(doRun);
}
}
});
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(textField1, BorderLayout.NORTH);
frame.add(textField2, BorderLayout.SOUTH);
frame.setVisible(true);
frame.pack();
}
private DocumentListenerAdapter() {
}
}
这篇关于Java:JFormattedTextField 保存数字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!