JTextField: переназначить десятичную запятую в точку

Я хочу переназначить десятичную запятую (немецкая клавиатура) в точку наверняка JTextFields. Я экспериментировал с getInputMap() а также getActionMap, но пока ничего не получалось. Наилучший результат, который я получил, был в том, что запятая вообще не работала.

Я думаю, что должен быть какой-то способ использования входной карты, но как?

Ниже приведен небольшой пример программы, может кто-нибудь дать мне подсказку о том, что заполнять в месте комментария? Или это все равно неправильно?

import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.KeyStroke;

public class KeyTest extends JFrame {

    private JTextField textField;

    public KeyTest() {
        textField = new JTextField();
        add(textField);

        InputMap map = textField.getInputMap();
        map.put(KeyStroke.getKeyStroke(','), /* what to do here? */);
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                KeyTest test = new KeyTest();
                test.pack();
                test.setVisible(true);
            }
        });
    }
}

РЕДАКТИРОВАТЬ: Возможно, я не был достаточно ясен с моим вопросом. С нормальными номерами проблем нет. Я просто хочу, чтобы пользовательский ввод был более удобным при вводе дат. это в формате "DD.MM.YYYY" в Германии. Это означает, что вы не можете вводить даты, используя только цифровую клавиатуру, потому что у нас нет десятичной точки, а запятая. Вот почему я хочу заменить запятую точкой в ​​текстовых полях, используемых для ввода дат.

Все поля ввода для обычного текста и чисел уже работают нормально, и даже ввод даты работает. Я просто хочу сделать набор текста проще. Буквально вчера я заметил похожую функциональность в Libreoffice, где запятая на цифровой клавиатуре (у меня немецкая клавиатура) автоматически заменяется в числовых ячейках (моя локаль установлена ​​на английский), но только в ячейках, содержащих числовые значения. Это также происходит при вводе текста.

5 ответов

Решение

Используйте следующее

textField.addKeyListener(new KeyListener(){

  public void keyTyped(KeyEvent e) {
    char c = e.getKeyChar();
     if (c== ',')
       e.setKeyChar('.');
  }
});

Как подсказывает @MKorbel, вы можете использовать JFormattedTextField и поставить подходящий Locale,

JFormattedTextField field = new JFormattedTextField(
    new NumberFormatter(NumberFormat.getNumberInstance(Locale.UK)));
field.setValue(new Double(123.45));
  • Я должен использовать JFormattedTextField или JSpinner с Number Formatter, довольно просто JTextField, у меня не было проблем с десятичным разделителем без установки для Locale

  • есть второй способ использовать DocumentFilter вместо InputMask, для фильтрации un_wanted whitespace а также non_numeric символы, и с помощью, чтобы изменить точку на желаемый десятичный разделитель

  • уведомление с помощью DocumentFilter, вывод из JFormattedTextField или JSpinner Java внутренне держать dot как десятичный разделитель ASCII, есть только разница между представлением и моделью (Swing Document) по сравнению с DocumentFilter, там возвращается измененная группировка (пробел) и разделитель тоже

То, что вы ищете, это "NumberFormat" (http://docs.oracle.com/javase/6/docs/api/java/text/NumberFormat.html)

Пример:

NumberFormat english = NumberFormat.getInstance(Locale.ENGLISH); 
Number n = english.parse("0.123");   //english notation
NumberFormat german = NumberFormat.getInstance(Locale.GERMAN);
System.out.println(german.format(n.floatValue())); //output 0,123 (german notation)

Я нашел другой способ справиться с проблемой запятой / точки, простой и короткий. Это решение должно работать во всем мире и не зависит от типа вашей клавиатуры и / или ваших настроек LOCALE.

Я использую JFormattedTextField для получения правильного локализованного вывода и добавления ".replace(',', '.')" К функции parseDouble(), как показано в примере ниже.

частная пустота ConvertMilesToKilometer () {

 Double inputNumber = 0.0;

 // to format the output string
 DecimalFormat df = new DecimalFormat("#,###.##");

 // another way will be to use LOCALE 
 // DecimalFormat df = (DecimalFormat)NumberFormat.getNumberInstance(Locale.GERMANY);

 // get user input
 try {
     inputNumber = Double.parseDouble(milesTextField.getText().replace(',', '.'));
 } catch (Exception e) {
     JOptionPane.showMessageDialog(this, "please enter a valid number!", null, JOptionPane.ERROR_MESSAGE);
 }

    // calculate and give the answer 
    String answer = df.format(inputNumber * 1.609344f);
    this.KilometersLabel.setText(answer + " Kilometers."); 

    // clear the input field 
    this.milesTextField.setText("");
}

Я надеюсь, это поможет. С уважением из Германии.

Другие вопросы по тегам