【问题标题】:JTextField: Remap decimal comma to pointJTextField:将十进制逗号重新映射到点
【发布时间】:2012-08-07 17:39:20
【问题描述】:

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

【问题讨论】:

  • 为什么?如果出于格式化/解析原因,下面的答案是正确的,因为其他人可能会有所不同(尽管我现在想不出其他人:-)
  • 我不明白。我确实住在德国,我也是德国人。但我从未尝试输入像 01,01,2012 这样的日期。但正如我已经发布的那样,答案仍然是 NumberFormat。如果您无法从一种格式解析数字(例如,默认语言环境,比如说 de),请尝试从 en 解析。但是,如果要始终显示“.”,则必须做出决定。作为用户的逗号或逗号的语言环境表示(例如“,”在德国)。
  • 这不是关于解析,而是关于将数字键盘上的逗号重新映射为指向。也许您从来不需要快速填写包含大量数字和日期字段的表单。如果您可以仅使用数字键盘输入所有值,则速度会更快。

标签: java swing events keyboard jtextfield


【解决方案1】:
  • 必须将JFormattedTextField 或JSpinner 与数字格式化程序一起使用,而不是简单的JTextField,如果没有设置Locale,我没有小数分隔符的问题

  • 还有第二种方法使用DocumentFilter 而不是InputMask,用于过滤不需要的whitespace 和non_numeric 字符,并将点更改为所需的小数分隔符

  • 注意通过使用DocumentFilter,从JFormattedTextField或JSpinner在内部输出Java将dot作为ASCII十进制分隔符,只有视图和模型(Swing Document)之间的区别与DocumentFilter相比,也返回了改变的分组(空格)和分隔符

【讨论】:

  • 抱歉,我的问题不清楚。这不是关于格式化和解析输入,而是关于在用户键入时重新映射十进制逗号以指向。
【解决方案2】:

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

JFormattedTextField field = new JFormattedTextField(
    new NumberFormatter(NumberFormat.getNumberInstance(Locale.UK)));
field.setValue(new Double(123.45));

【讨论】:

    【解决方案3】:

    您正在寻找的是“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)
    

    【讨论】:

    • 不,绝对不是。我知道这一点,但我希望在用户键入时替换逗号。
    • 答案仍然是NumberFormat。将 textChangeListener 添加到 JTextField 并使用 NumberFormat.getInstance(...).parse(/*data from event here*/ 解析输入值。如果出现错误,您获得了错误的区域设置,请使用默认设置重试。将值设置为 textField 就完成了
    【解决方案4】:

    使用下面的

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

    【讨论】:

    • 否 - 无论出现什么问题,keyListener 不是答案。
    • 在没有用户真实位置信息的情况下很有用。非常感谢!
    【解决方案5】:

    我找到了另一种处理逗号/点问题的方法,它既简单又简短。 此解决方案应该适用于世界各地,并且不取决于您的键盘类型和或 您的 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("");
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多