我正在尝试使用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);
}
});
[但是,我不能修改它,它是自动生成的。]
答案 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_DOWN
和KEY_UP
。 KEY_DOWN
事件将在文本真正输入字段之前发生,因此您的代码触发将仍然将该字段视为空白。尝试将空字符串转换为数字会给出格式异常。
解决此问题的最简单方法是其他人发布的try
/ catch
结构。
答案 2 :(得分:0)
您可能将操作设置为keyDown,这意味着即使在将键值“添加”到文本框之前也会发生,而您从中检索值仍为空""
。
答案 3 :(得分:0)
有一个简单的练习 Celsius-Fahrenheit转换器
这是一个非常古老的例子。更好的方法是使用DocumentListener,而不是KeyListener。