KeyPressed事件

时间:2010-09-03 12:54:32

标签: java user-interface keypress netbeans6.8

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

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

所以,我在文本字段上放了一个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);
    }
});

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

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

我怀疑发生的事情是你用celsiusText.addKeyListener添加这些处理程序,是吗?

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

  

有一个简单的练习   Celsius-Fahrenheit转换器

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