我正在尝试创建一个可以将java中的华氏温度转换为celcius的程序。在程序中我有2个标签和1个TextField用于输入。我想在用户输入温度时按转换温度并按 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 触发。
答案 0 :(得分: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();
}
答案 1 :(得分:0)
迟到的答案,但是我尝试了问题中的代码并且KeyPressed确实触发了,但是因为JLabel没有更新,你认为KeyEvent没有被触发。
在
之后outcome = input.getText();
添加
result.setText("Temperature in Celcius is: " + outcome);
所以标签会自行更新。
答案 2 :(得分:0)
按钮不需要KeyListener
(并且大多数情况下不应该使用它们),它们使用ActionListener
来响应所有激活事件,包括 Enter ,鼠标点击和键盘快捷键,这是一个更加简化的API。
有关详细信息,请参阅How to Use Buttons, Check Boxes, and Radio Buttons,How to Write an Action Listeners和How to Use Actions
您也可以将按钮设置为“默认”按钮,可以在未聚焦时激活(只要当前聚焦的组件不使用/消耗 Enter 键)
答案 3 :(得分:0)
首先,您需要实现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);
}
}