6

我正在尝试制作一个可以在java中将华氏温度转换为摄氏度的程序。在程序中,我有 2 个标签和 1 个文本字段用于输入。我想在用户输入温度并按下时转换温度Enter。为此,我在我的文本字段中添加了一个关键侦听器,但它不起作用。当我按下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.

4

5 回答 5

5

尝试使用 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();
}
于 2013-01-13T23:36:30.247 回答
1

首先,您需要实现 KeyListener 中的所有方法。你还没有实现 keyTyped 和 keyReleased。另一件事是您应该检查键代码而不是键字符,因为“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);


}

}
于 2016-05-11T06:18:56.203 回答
0

迟到的答案,但我尝试使用问题中的代码并且 KeyPressed 确实触发了,但是因为 JLabel 没有更新,你假设 KeyEvent 没有被触发。

刚过

outcome = input.getText(); 

添加

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

所以标签会自行更新。

于 2014-03-08T12:21:17.283 回答
0

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

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

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

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

于 2014-11-24T21:19:18.880 回答
0

这应该有效

if (e.getKeyChar() == 10) {
    System.out.println("enter");
 }

输入 ASCII 码为 10 而 KeyEvent.VK_ENTER 为回车返回 13

于 2021-12-11T23:29:06.867 回答