2013-01-13 30 views
5

我試圖製作一個程序,可以將華氏轉換爲java中的celcius。在程序中我有2個標籤和1個TextField輸入。我想在用戶輸入溫度時按下轉換溫度並按輸入。要做到這一點,我添加了一個關鍵偵聽器到我的文本字段,但它不起作用。當我按輸入聽衆根本不開火。Textfield中的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 。com/javase/tutorial/uiswing/misc/keybinding.html) - 實際上,爲你正在嘗試做的事情最好使用一個'ActionListener' - 這就是它的設計目的 - 記住,[Enter]並不總是「接受「每個平臺的關鍵;) – MadProgrammer

+0

我被試圖使用動作監聽器。一切都很順利,直到我找不到如何檢查在ActionListener中是否按下Enter鍵。 – Miral

+2

重要嗎?從獨立於平臺的角度來看,當用戶觸發該平臺的「接受」操作時,將觸發「ActionListener」。對於大多數平臺來說,這恰好是[Enter]鍵。 – MadProgrammer

回答

4

嘗試使用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(); 
} 
+0

不錯的建議,但是,*「當我按下輸入監聽器時根本不會啓動」* [Enter]鍵在事件鏈上被消耗得更高,這意味着監聽器永遠不會被觸發 - [Enter]開始被使用其他東西的文本字段,並開始消耗 – MadProgrammer

+0

這是真的,雖然我認爲他們正在判斷是否偵聽器觸發,是否實際上導致輸出打印。也許我不應該做出這樣的假設... – 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更多細節

您還可以設置一個按鈕爲「默認」按鈕無法聚焦時,只要當前所關注的組件不使用/消費被激活(在輸入鍵)

更多細節

0

首先看到的JRootPane#setDefaultButtonHow to Use Root Panes,你需要實現所有從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); 


} 

} 
相關問題