按Enter键时,Textfield中的KeyListener不会触发

我正在尝试制作一个程序,可以将华氏度转换为java中的celcius。 在程序中我有2个标签和1个TextField用于输入。 我想在用户输入温度时按转换温度进行转换温度。 为此,我在我的文本字段中添加了一个关键监听器,但它不起作用。 当我按Enter时,听者根本不会开火。

这是我的代码。

public class TempConv extends JFrame{ private JLabel info; private JLabel result; private JTextField input; private String outcome; public TempConv(){ super("Temperature Converter"); setLayout(new BorderLayout()); info = new JLabel("Enter Fahrenheit Temperature"); add(info, BorderLayout.NORTH); input = new JTextField(12); add(input, BorderLayout.CENTER); result = new JLabel("Temperature in Celcius is: " + outcome); add(result, BorderLayout.SOUTH); input.addKeyListener( new KeyListener(){ public void keyPressed(KeyEvent e){ if(e.getKeyChar() == KeyEvent.VK_ENTER){ outcome = input.getText(); } } } ); } public static void main(String[] args) { TempConv ftc = new TempConv(); ftc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ftc.setLocationRelativeTo(null); ftc.setSize(370, 100); ftc.setVisible(true); } } 

编辑:它适用于ActionListener,但我需要使用匿名类。 如果没有匿名类,则使用Enter触发。

尝试使用e.getKeyCode()而不是e.getKeyChar()。 常量KeyEvent.VK_ENTER是一个int,而不是char。

换一种说法:

 if(e.getKeyCode() == KeyEvent.VK_ENTER){ outcome = input.getText(); } 

代替

 if(e.getKeyChar() == KeyEvent.VK_ENTER){ outcome = input.getText(); } 

迟到的答案,但我尝试了问题中的代码和KeyPressed确实触发,但因为JLabel没有更新,你认为KeyEvent没有被触发。

刚过

 outcome = input.getText(); 

 result.setText("Temperature in Celcius is: " + outcome); 

所以标签会自行更新。

按钮不需要KeyListener (并且大多数情况下不应该使用它们),它们使用ActionListener来响应所有激活事件,包括Enter ,鼠标单击和键盘快捷键,这是一个更加简化的API。

有关详细信息,请参阅如何使用按钮,复选框和单选按钮 , 如何编写动作侦听器以及如何使用操作

您还可以将按钮设置为“默认”按钮,可以在未聚焦时激活(只要当前聚焦的组件不使用/使用Enter键)

有关详细信息,请参阅JRootPane#setDefaultButton和如何使用根窗格

首先,您需要实现KeyListener中的所有方法。 您尚未实现keyTyped和keyReleased。 另一件事是你应该检查密钥代码而不是密钥char,因为“Enter”字符不可见,所以最好你应该检查密钥代码是否等于KeyEvent.VK_ENTER。 最后一件事是当你按Enter键更新结果String变量但你没有在任何地方显示它,所以你需要在结果JLabel上设置文本。 你也忘了进行转换。 我的解释可能令人困惑,但下面是代码:

 import java.awt.BorderLayout; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; public class TempConv extends JFrame{ private JLabel info; private JLabel result; private JTextField input; private String outcome; public TempConv(){ super("Temperature Converter"); setLayout(new BorderLayout()); info = new JLabel("Enter Fahrenheit Temperature"); add(info, BorderLayout.NORTH); input = new JTextField(12); add(input, BorderLayout.CENTER); result = new JLabel("Temperature in Celcius is: " + outcome); add(result, BorderLayout.SOUTH); input.addKeyListener( new KeyListener(){ @Override public void keyPressed(KeyEvent e){ if(e.getKeyCode() == KeyEvent.VK_ENTER){ outcome = input.getText(); double celsius = (((Double.valueOf(outcome)) - 32) * 5 / 9 ); result.setText("Temperature in Celcius is: " + celsius); } } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } } ); } public static void main(String[] args) { TempConv ftc = new TempConv(); ftc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ftc.setLocationRelativeTo(null); ftc.setSize(370, 100); ftc.setVisible(true); } }