Java 按enter键时,文本字段中的KeyListener未触发

Java 按enter键时,文本字段中的KeyListener未触发,java,swing,awt,listener,keylistener,Java,Swing,Awt,Listener,Keylistener,我正在尝试制作一个程序,可以用java将华氏温度转换成摄氏温度。在程序中,我有2个标签和1个文本字段用于输入。我想在用户键入温度并按Enter键时转换温度。为此,我在文本字段中添加了一个键侦听器,但它不起作用。当我按下回车键时,一点也不开火 这是我的密码 public class TempConv extends JFrame{ private JLabel info; private JLabel result; private JTextField input; private Strin

我正在尝试制作一个程序,可以用java将华氏温度转换成摄氏温度。在程序中,我有2个标签和1个文本字段用于输入。我想在用户键入温度并按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();
}

回答晚了,但我尝试了问题中的代码,按键确实触发了,但是由于JLabel没有更新,所以您假设没有触发KeyEvent

刚过

outcome = input.getText(); 


因此标签会自动更新。

按钮不需要
键盘监听器(大多数情况下不应该使用),它们使用
ActionListener
来响应所有激活事件,包括回车、鼠标单击和键盘快捷键,这是一个简化得多的API

有关详细信息,请参见和

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


有关更多详细信息,请参见和。首先,您需要从KeyListener实现所有方法。您尚未实现keyTyped和KeyRelease。另一件事是,您应该检查密钥代码而不是密钥字符,因为“Enter”字符不可见,所以最好检查密钥代码是否等于KeyEvent.VK_Enter。最后一件事是,当您按下enter键时,您将更新结果字符串变量,但不会在任何地方显示它,因此需要在结果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);


}

}

事件被消费在事件链的更高层,因此它永远不会到达您的手中,最好使用-实际上,最好使用
ActionListener
来完成您试图做的事情-这就是它的设计目的-记住,[输入]并不总是每个平台的“接受”键;)我试图使用动作监听器。一切都很顺利,直到我找不到如何检查ActionListener中是否按下了enter键。这有关系吗?从平台无关的角度来看,当用户触发该平台的“接受”操作时,将触发
ActionListener
。碰巧对于大多数平台来说,这是[Enter]键。“我错了吗?”是的..而不是。
KeyListener
是针对您试图实现的目标的低级API。如果您真的想监视[Enter]键,那么必须替换文本字段使用的键绑定begin。但是,这将改变应用程序在其他平台上的工作方式,因此需要使用
ActionListener
。这允许外观决定在什么条件下触发
ActionListener
。在大多数平台下,这是[Enter]键……嗯。。我明白你的意思。接下来我将重点介绍ActionListener。很好的建议,但是,“当我按下enter listener时,一点也不触发”[enter]键在事件链的更高层被使用,这意味着侦听器从未被触发-[enter]被文本字段用于其他内容,并且是begin consumedThis,虽然我假设他们正在判断监听器是否触发,但取决于if语句是否实际导致输出被打印。也许我不应该做出这样的假设……正如我所说,很好的建议,否则的话,OP应该考虑到未来的考虑,只是在这种情况下没有帮助,对不起
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);


}

}