【问题标题】:KeyPressed event按键事件
【发布时间】:2010-09-03 22:38:05
【问题描述】:

我正在尝试使用 NetBeans6.8 学习有关 GUI 的知识,从 Java 教程中的 GUI 部分开始。

有一个摄氏-华氏转换器的简单练习。我希望它有两个文本字段,一个用于摄氏温度,一个用于华氏温度;如果用户在摄氏度文本字段中键入,他会在华氏文本字段中得到“打印”的结果。反之亦然。

所以,我在两个文本字段中都设置了一个 KeyTyped 事件,代码如下:

private void celsiusTextKeyTyped(java.awt.event.KeyEvent evt) {                                
    int cels = Integer.parseInt(celsiusText.getText());
    int fahr = (int)(cels * 1.8 + 32);
    fahrText.setText(fahr + ""); 
}                                    

private void fahrTextKeyTyped(java.awt.event.KeyEvent evt) {                                
    int fahr = Integer.parseInt(fahrText.getText());
    int cels = (int)(fahr / 1.8 - 32);
    celsiusText.setText(cels + ""); 
}

它不起作用。如果我在文本字段中输入内容,我会收到此异常:java.lang.NumberFormatException: For input string: ""

附加监听器的代码:

celsiusText.addKeyListener(new java.awt.event.KeyAdapter() {
    public void keyTyped(java.awt.event.KeyEvent evt) {
        celsiusTextKeyTyped(evt);
    }
});

fahrText.addKeyListener(new java.awt.event.KeyAdapter() {
    public void keyTyped(java.awt.event.KeyEvent evt) {
        fahrTextKeyTyped(evt);
    }
});

[但是,我不能修改它,它是自动生成的。]

【问题讨论】:

    标签: java user-interface keypress netbeans6.8


    【解决方案1】:

    方法 .getText() 返回一个字符串而不是数字,如果该字符串包含非数字字符(即字母、空格,什么都没有),则 parseInt 将抛出 NumberFormatException。由于您使用 KeyEvent,只要您按下“7”,该事件就会在 7 输入到文本框中之前触发。因此,文本框仍然只包含“”,这是错误的来源。您可能还希望改为收听 keyUp 事件。

    您需要将代码包含在 try catch 块中。

    private void fahrTextKeyTyped(java.awt.event.KeyEvent evt)
    {   
        try
        {                             
            int fahr = Integer.parseInt(fahrText.getText());
            int cels = (int)(fahr / 1.8 - 32);
            celsiusText.setText(cels + "");
        }
        catch(NumberFormatException ex)
        {
            //Error handling code here, i.e. informative message to the user
        }
    }
    

    另一种方法是您可以在 keydown 事件中过滤掉非数字,请参见此处的示例 - http://www.javacoffeebreak.com/java107/java107.html(创建自定义组件 - NumberTextField)

    【讨论】:

    • Integer.parseInt() 接受一个字符串并返回一个整数...你的意思是如果它没有得到一个“数字字符串”吗?
    • 我强烈建议使用 NumberFormatException 而不是全局异常,并打印堆栈跟踪。不过这不解决问题只会把他藏起来。
    • @Vash,完全同意,只是突然出现了一个快速解决方案。我已经编辑了匹配的解决方案;) @antonyt, "3" = 3, "63" = 63, "0" = 0, "a" = ERROR, "" = ERROR。
    • 我的意思是您的回答具有误导性,因为您建议 getText() 方法可以返回字符串以外的内容。 "3" 仍然是一个字符串。
    • @antonyt,你说的终于让我明白了,我会修改我的答案。
    【解决方案2】:

    我怀疑发生的事情是您在这些处理程序中添加了 celsiusText.addKeyListener 之类的东西,是吗?

    问题是,这不仅会为您提供您想要的KEY_TYPED 事件,还会为您提供KEY_DOWNKEY_UPKEY_DOWN 事件将在文本真正输入到字段之前发生,因此您触发的代码将看到该字段仍为空白。尝试将空字符串转换为数字会导致格式异常。

    解决此问题的最简单方法是其他人发布的 try/catch 构造。

    【讨论】:

      【解决方案3】:

      您可能将操作设置为 keyDown,这意味着即使在键值“添加”到文本框之前发生,而您从中检索的值仍然是空的 ""

      【讨论】:

        【解决方案4】:

        有一个简单的练习 摄氏度-华氏度转换器

        这是一个非常古老的例子。更好的方法是使用 DocumentListener,而不是 KeyListener。

        【讨论】:

          猜你喜欢
          • 2015-01-28
          • 1970-01-01
          • 2012-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-23
          • 1970-01-01
          相关资源
          最近更新 更多