У меня есть JTextField
I, отформатированный с помощью NumberFormatter
. Он отлично работает, пока я не попытаюсь добавить нуль, тогда он увеличит поле до примерно 10000 х старого ввода. это не самая большая сделка в мире, просто немного запутанная попытка исправить ввод как пользователь.
Как указано ниже, удаление setMaximumuFraction()
/setMinimumFraction()
а также setOverwriteMode()
заставил его работать, как хотелось бы.
private void setValues(){
name = new JFormattedTextField();
format = NumberFormat.getCurrencyInstance(Locale.US);
format.setMinimumFractionDigits(2);
format.setMaximumFractionDigits(2);
formatter = new NumberFormatter(format);
formatter.setMinimum(0.0);
formatter.setMaximum(10000000.0);
formatter.setAllowsInvalid(false);
formatter.setOverwriteMode(true);
price = new JFormattedTextField(formatter);
price.setValue(0.0);
}
Что мой текущий код, я объявляю переменные с
private JFormattedTextField name, price;
private NumberFormat format;
private NumberFormatter formatter;
Возможно, потому, что я установил setMinimumFractionDigits()
в 2 или что нет.
Есть идеи?
Вот пример рабочего кода. Просто нужно скомпилировать его самостоятельно:
import java.awt.EventQueue;
import java.text.NumberFormat;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFormattedTextField;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.text.NumberFormatter;
public class testClass extends JPanel{
private JFormattedTextField name, price;
private int option;
private NumberFormat format;
private NumberFormatter formatter;
public testClass(){
initComponents();
startPanel();
}
private void initComponents(){
name = new JFormattedTextField();
format = NumberFormat.getCurrencyInstance(Locale.US);
format.setMinimumFractionDigits(2);
format.setMaximumFractionDigits(2);
formatter = new NumberFormatter(format);
formatter.setMinimum(0.0);
formatter.setMaximum(10000000.0);
formatter.setAllowsInvalid(false);
formatter.setOverwriteMode(true);
price = new JFormattedTextField(formatter);
price.setValue(0.0);
}
private void startPanel(){
Object[] message = {
"Item Name", name,
"Item Price", price,
};
option = JOptionPane.showConfirmDialog(this, message, "New Customer Information", JOptionPane.OK_CANCEL_OPTION);
}
public static void main (String[] args){
try {
for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
Logger.getLogger(testClass.class.getName()).log(Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
Logger.getLogger(testClass.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(testClass.class.getName()).log(Level.SEVERE, null, ex);
} catch (UnsupportedLookAndFeelException ex) {
Logger.getLogger(testClass.class.getName()).log(Level.SEVERE, null, ex);
}
EventQueue.invokeLater(new Runnable() {
public void run() {
new testClass().setVisible(true);
}
});
}
}
Я думаю, что это можно устранить, если не установить режим перезаписи форматирования в значение true. Также эти ребята не должны быть нужны:
format.setMinimumFractionDigits(2);
format.setMaximumFractionDigits(2);
Поскольку формат валюты Locale.US должен уже позаботиться об этом.
Изменение: это минимальная примерная программа, которую я использовал для проверки кода:
import java.text.NumberFormat;
import java.util.Locale;
import javax.swing.*;
import javax.swing.text.NumberFormatter;
public class TestList {
static JFormattedTextField price;
static NumberFormat format;
static NumberFormatter formatter;
public static void main(String[] args) {
setValues();
JPanel panel = new JPanel();
panel.add(new JLabel("price:"));
panel.add(price);
JOptionPane.showMessageDialog(null, panel);
}
private static void setValues(){
format = NumberFormat.getCurrencyInstance(Locale.US);
// format.setMinimumFractionDigits(2);
// format.setMaximumFractionDigits(2);
formatter = new NumberFormatter(format);
formatter.setMinimum(0.0);
formatter.setMaximum(10000000.0);
formatter.setAllowsInvalid(false);
// formatter.setOverwriteMode(true);
price = new JFormattedTextField(formatter);
price.setColumns(10);
price.setValue(0.0);
}
}
Обратите внимание, что я удалил поле имени, поскольку оно совершенно не имеет отношения к вашей проблеме и сделало все статическим, чтобы оно могло запускаться из простого статического основного метода.