Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按键事件_Java_User Interface_Keypress_Netbeans6.8 - Fatal编程技术网

Java 按键事件

Java 按键事件,java,user-interface,keypress,netbeans6.8,Java,User Interface,Keypress,Netbeans6.8,我试图学习一些关于GUI的知识,使用NetBeans6.8,从java教程中的GUI部分开始 这里有一个简单的摄氏-华氏转换器练习。我希望它有两个文本字段,一个表示摄氏温度,一个表示华氏温度;如果用户在“摄氏度”文本字段中键入,则会在“华氏度”文本字段中“打印”结果。反之亦然 因此,我在两个文本字段上放置了一个键类型事件,下面是代码: private void celsiusTextKeyTyped(java.awt.event.KeyEvent evt) {

我试图学习一些关于GUI的知识,使用NetBeans6.8,从java教程中的GUI部分开始

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

因此,我在两个文本字段上放置了一个键类型事件,下面是代码:

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:对于输入字符串:“”

附加侦听器的代码:

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);
    }
});
[但是,我无法修改它,它是自动生成的。]

方法。getText()返回一个字符串而不是数字,如果该字符串包含非数字字符(即字母、空格、无任何内容),则parseInt将抛出NumberFormatException。由于您正在使用KeyEvent,因此只要按say“7”,就会在文本框中输入7之前触发事件。因此,文本框仍然只包含“”,这是错误的来源。您可能还希望收听键控事件

您需要将代码封装在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事件中过滤掉非数字,请参见此处的示例-(创建自定义组件-NumberTextField)

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

我怀疑所发生的事情是您添加了类似于
celsiusText.addKeyListener
的处理程序,是吗

问题是,这不仅会为您提供所需的
KEY\u键入的
事件,还会提供
KEY\u DOWN
KEY\u UP
KEY\u DOWN
事件将在文本真正输入到字段之前发生,因此您的代码启动后,该字段仍为空白。尝试将空字符串转换为数字会导致格式异常

解决这一问题的最简单方法是“尝试”/
捕获”
构造其他人已经发布的内容

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


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

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