问题描述
在我的应用程序中,我想将数字(金额)输入到特定限制,因此使用了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而不是4596不应该被淘汰。
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
,最好使用 DocumentListener
,
even JFormattedTextField
implements DecimalFormat
and NumberFormat
, better would be use DocumentListener
,
1)使用<$ c跳过大数字
之间的差距不大实现setMinimum()$ c> DecimalFormat 或 NumberFormat
简单用户不可接受
和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
默认情况下实现插入文本,然后任何解决方法都是<$ c通过implements JFormattedTextField
使用 DecimalFormat
或 User-non-Acceptable
$ c> NumberFormat by implements 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)它非常舒适的使用 DocumentListener
允许添加任何金额,但突出显示范围
3) its very confortable je use DocumentListener
allows add any amount, but with highlighting out-off range
4)或使用 JSpinner
用 SpinnerNumberModel
,可以设置Formatter和Number Instance
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保存数字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!