Java: JFormattedTextField сохранение чисел
В моем приложении я хочу ввести числа (суммы) до определенного предела, и, следовательно, использовал JFormattedTextField. Ограничение как "12345678.99", т.е. 8 цифр перед "." и 2 после "." или так далее. Это мой код реализации, но он не дает ожидаемого результата.
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
Куда я иду не так? И как заставить это работать так, как я этого ожидаю.
ОБНОВЛЕНИЯ, ПРЕДЛАГАЕМЫЕ СТАНИСЛАВОМ:
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" не должно быть исключено.
2 ответа
Четное JFormattedTextField
инвентарь DecimalFormat
а также NumberFormat
лучше бы использовать DocumentListener
,
1) не очень хорошо прыгать между Big Figures
используя DecimalFormat
или же NumberFormat
просто User-non-Acceptable
реализует setMinimum() и setMaximum ()
2) JTextComponents
по умолчанию реализует вставку текста, тогда любой обходной путь User-non-Acceptable
орудиямиJFormattedTextField
с DecimalFormat
или жеNumberFormat
реализует setMinimum() и setMaximum ()
3) его очень удобно использовать DocumentListener
позволяет добавить любое количество, но с выделением вне диапазона
4) или использовать JSpinner
с SpinnerNumberModel
есть возможность установить Formatter как для числового экземпляра
пример для 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() {
}
}
Передайте десятичный формат в JFormattedTextField
конструктор. Имеет следующие методы
setMaximumIntegerDigits
setMinimumIntegerDigits
setMaximumFractionDigits
setMinimumFractionDigits