У меня есть JFormattedTextField с NumberFormat с Locale.US. Таким образом, десятичный разделитель является точкой, а разделителем группировки является запятая.NumberFormat parse недостаточно строгий
Теперь я набираю строку «1,23» в этом текстовом поле и перемещаю фокус на другой компонент. Я бы ожидал, что строка исчезнет (например, когда я набираю «a» вместо «1,23»), потому что это явно не допустимое представление числа при использовании Locale.US. Но вместо этого текст в текстовом поле изменяется на «123».
Это потому, что используемый метод NumberFormat не является строгим при разборе и просто игнорирует запятую.
Вопрос: Как я могу указать NumberFormat для того,
Код проверки:
JDialog dialog = new JDialog();
JPanel panel = new JPanel(new BorderLayout());
dialog.getContentPane().add(panel);
NumberFormat nf = NumberFormat.getInstance(Locale.US);
JFormattedTextField textField = new JFormattedTextField(nf);
textField.setText("1,23");
panel.add(textField, BorderLayout.CENTER);
panel.add(new JButton("focus"), BorderLayout.EAST);
dialog.pack();
dialog.setVisible(true);
Переместить фокус из текстового поля с кнопкой, и текст изменится на «123».
Это не дубликат. Другой вопрос касался целых, а не парных. Вопрос здесь сводится к чрезмерному методу NumberFormat, который не проверяет, разрешена ли запятая в этой позиции. Похоже, нам нужен подкласс NumberFormat с более строгой проверкой. –
@ RalfH: Вы правы, это не дубликат. Я отредактировал вопрос, чтобы показать базовое использование NumberFormat в JFormattedTextField. –
Как я могу удалить дублируемую метку из этого вопроса? Я хотел бы опубликовать собственное решение. –