Java 按键事件
我试图学习一些关于GUI的知识,使用NetBeans6.8,从java教程中的GUI部分开始 这里有一个简单的摄氏-华氏转换器练习。我希望它有两个文本字段,一个表示摄氏温度,一个表示华氏温度;如果用户在“摄氏度”文本字段中键入,则会在“华氏度”文本字段中“打印”结果。反之亦然 因此,我在两个文本字段上放置了一个键类型事件,下面是代码: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) {
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,你说的话终于让我明白了,我会给出我的答案。