6

Javaで華氏を摂氏に変換できるプログラムを作ろうとしています。プログラムには、入力用に 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.

4

5 に答える 5

5

e.getKeyChar() の代わりに e.getKeyCode() を試してください。定数 KeyEvent.VK_ENTER は、char ではなく int です。

言い換えると:

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 キーを押すと、結果の 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);


}

}
于 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 に答える