3

我想将十进制逗号(德语键盘)重新映射到某个点JTextField。我已经尝试过getInputMap()and 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 中的一个类似功能,其中数字小键盘上的逗号(我有一个德语键盘)在数字单元格(我的语言环境设置为英语)中自动替换,但仅在包含数值的单元格中。这也会在您键入时发生。

4

5 回答 5

3

正如@MKorbel 建议的那样,您也许可以使用JFormattedTextField并提供合适的Locale.

JFormattedTextField field = new JFormattedTextField(
    new NumberFormatter(NumberFormat.getNumberInstance(Locale.UK)));
field.setValue(new Double(123.45));
于 2012-08-10T12:17:00.333 回答
3
  • 必须使用带有数字格式化程序的JFormattedTextFieldJSpinner,而不是普通的 JTextField,我没有设置小数分隔符的问题Locale

  • 还有第二种方法可以使用DocumentFilter而不是InputMask, 来过滤 un_wantedwhitespacenon_numericchars,并将 dot 更改为所需的小数分隔符

  • 注意,使用JFormattedTextFieldJSpinnerDocumentFilter的输出在内部保存为 ASCII 小数分隔符,与 相比,视图和模型()之间只有区别,返回更改的分组(空格)和分隔符 JavadotSwing DocumentDocumentFilter

于 2012-08-10T12:37:32.323 回答
2

您正在寻找的是“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)
于 2012-08-10T12:18:03.967 回答
1

使用以下

textField.addKeyListener(new KeyListener(){

  public void keyTyped(KeyEvent e) {
    char c = e.getKeyChar();
     if (c== ',')
       e.setKeyChar('.');
  }
});
于 2012-08-10T13:20:36.943 回答
0

我找到了另一种管理逗号/点问题的方法,它既简单又简短。此解决方案应该适用于世界各地,并且不取决于您的键盘类型和/或您的 LOCALE 设置。

我正在使用 JFormattedTextField 来获得正确的本地化输出并将“.replace(',', '.')”添加到 parseDouble() 函数中,如下面的示例所示。

私人无效 ConvertMilesToKilometers() {

 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("");
}

我希望这将有所帮助。来自德国的问候。

于 2014-09-11T09:36:15.413 回答