JTextField: переназначить десятичную запятую в точку
Я хочу переназначить десятичную запятую (немецкая клавиатура) в точку наверняка JTextField
s. Я экспериментировал с 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_wantedwhitespace
а такжеnon_numeric
символы, и с помощью, чтобы изменить точку на желаемый десятичный разделительуведомление с помощью
DocumentFilter
, вывод из JFormattedTextField или JSpinnerJava
внутренне держать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("");
}
Я надеюсь, это поможет. С уважением из Германии.