2013-01-13 8 views
5

javaで華氏をcelciusに変換できるプログラムを作成しようとしています。プログラムでは、入力用に2つのラベルと1つのTextFieldがあります。ユーザーが温度とプレスを入力すると変換温度を作りたいを入力してください。そのためには、テキストフィールドにキーリスナーを追加しましたが、動作しません。私がを押すと、リスナーを入力しても全く発砲しません。Enterキーを押したときにTextListのKeyListenerが起動しない

これは私のコードです。

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で動作しますが、私は匿名クラスでそれを行う必要があります。匿名クラスなしではと入力してください。と入力してください。

+2

イベントがイベントチェーン、したがって、それは使用する方、あなたに届くことはありません[キーバインディング](http://docs.oracleまで高い消費されています。実際には、あなたがやろうとしていることのために 'ActionListener'を使用する方が良いでしょう - それはそれが意図しているものです - [Enter]は必ずしも"すべてのプラットフォームでキーを受け入れる) – MadProgrammer

+0

アクションリスナーを使用しようとしました。 ActionListenerでEnterキーが押されたかどうかを確認する方法が見つからない限り、すべてがうまくいった。 – Miral

+2

それは問題ですか?プラットフォームに依存しない観点から、ユーザがそのプラットフォームに対して「受諾」アクションをトリガすると、「ActionListener」がトリガされる。ほとんどのプラットフォームで[Enter]キーが使用されています。 – MadProgrammer

答えて

4

e.getKeyChar()の代わりにe.getKeyCode()を試してください。定数KeyEvent.VK_ENTERはintであり、charではありません。言い換えれば

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

代わりの

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

素晴らしい提案ですが、*「Enter listenerを起動しても起動しないと」* [Enter]キーがイベントチェーンの上位に消費されています。つまり、リスナーは決して起動されません。他のもののテキストフィールドは消費され始めます – MadProgrammer

+0

ifステートメントが実際に出力を出力するかどうかに関わらず、リスナーが起動するかどうかを判断しているとします。おそらく私はそのような仮定をしてはならないはずです... – Sinkingpoint

+0

はい、私もそれを試みましたが、うまくいきませんでした。 – Miral

0

後期の答えが、私は問題のコードとKeyPressedやったトリガーと試みたが、JLabelのがなかったので、更新すると、KeyEventが起動されなかったものとみなしました。

だけ

outcome = input.getText(); 

後にそう標識は、それ自体を更新する

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

を追加します。

0

ボタンは(そしてほとんどの部分のためにそれらを使用しないでください)KeyListenerを必要としない、彼らは、マウスクリックやキーボードショートカットを入力し含め、すべてのアクティブ化イベントに応答するActionListenerを使用し、それははるかです簡略化されたAPI。

はあなたにもそう長く、現在フォーカスの成分が消費/使用しないよう集中していない場合に起動することができ、「デフォルト」ボタン(とボタンを設定することができ、より詳細

ためHow to Use Buttons, Check Boxes, and Radio ButtonsHow to Write an Action ListenersHow to Use Actionsを参照してください。 キーを入力してください)

は、すべての詳細についてJRootPane#setDefaultButtonHow to Use Root Panes

0

まずを参照してください、あなたはのKeyListenerからのすべてのメソッドを実装する必要があります。あなたはkeyTypedとkeyReleasedを実装していません。もう一つは、 "Enter"文字が表示されないため、キーコードの代わりにキーコードをチェックする必要があるため、キーコードがKeyEvent.VK_ENTERと等しいかどうかを確認する必要があります。最後のことは、結果のString変数を更新して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); 


} 

} 
関連する問題