2013-01-13 28 views
5

Tôi đang cố gắng tạo một chương trình có thể chuyển đổi fahrenheit thành celcius bằng java. Trong chương trình tôi có 2 nhãn và 1 TextField cho đầu vào. Tôi muốn tạo nhiệt độ chuyển đổi khi người dùng nhập nhiệt độ và nhấn Nhập. Để làm điều đó, tôi đã thêm một người nghe chính vào trường văn bản của tôi nhưng nó không hoạt động. Khi tôi bấm Nhập người nghe không hề bắn.KeyListener trong Textfield không kích hoạt khi nhấn enter

Và đây là mã của tôi.

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); 


} 

} 

Edit: Nó hoạt động với ActionListener nhưng tôi cần phải làm điều đó với lớp nặc danh. Không có lớp ẩn danh, nó sẽ cháy với Nhập.

+2

Sự kiện này được được tiêu thụ cao hơn trong chuỗi sự kiện, do đó nó không bao giờ tới bạn, tốt hơn để sử dụng [Key Bindings] (http://docs.oracle .com/javase/tutorial/uiswing/misc/keybinding.html) - Thực ra, tốt hơn nên sử dụng 'ActionListener' cho những gì bạn đang cố gắng làm - đó là những gì nó được thiết kế cho - hãy nhớ rằng, [Enter] không phải lúc nào cũng là" chấp nhận "chìa khóa cho mọi nền tảng;) – MadProgrammer

+0

Tôi đã cố gắng sử dụng trình nghe hành động. Mọi thứ diễn ra tốt đẹp đến mức tôi không thể tìm cách kiểm tra xem phím enter có được nhấn hay không trong ActionListener. – Miral

+2

Có quan trọng không? Từ quan điểm độc lập nền tảng, 'ActionListener' sẽ được kích hoạt khi người dùng kích hoạt hành động" chấp nhận "cho nền tảng đó. Nó chỉ xảy ra với hầu hết các nền tảng, đó là phím [Enter]. – MadProgrammer

Trả lời

4

Hãy thử e.getKeyCode() thay vì e.getKeyChar(). KeyEvent.VK_ENTER không đổi là một int, không phải là một char.

Nói cách khác:

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

thay vì

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

Đề xuất hay, nhưng, * "Khi tôi nhấn enter, người nghe không kích hoạt" * phím [Enter] đang được tiêu thụ cao hơn chuỗi sự kiện, nghĩa là người nghe không bao giờ được kích hoạt - [Enter] được bắt đầu sử dụng trường văn bản cho cái gì khác và được bắt đầu tiêu thụ – MadProgrammer

+0

Điều này đúng, mặc dù tôi cho rằng họ đang đánh giá liệu người nghe có hoả hoạn hay không, về việc liệu câu lệnh if có thực sự gây ra đầu ra được in hay không. Có lẽ tôi không nên đưa ra giả định như vậy ... – Sinkingpoint

+0

Vâng, tôi đã thử điều đó nhưng nó không hoạt động. – Miral

0

Cuối câu trả lời, nhưng tôi đã cố gắng với mã trong câu hỏi và keyPressed đã kích hoạt, nhưng vì JLabel không cập nhật, bạn cho rằng KeyEvent không được kích hoạt.

Ngay sau khi

outcome = input.getText(); 

thêm

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

nên nhãn sẽ cập nhật chính nó.

0

Buttons không cần một KeyListener (và đối với hầu hết các phần không nên sử dụng chúng), họ sử dụng một ActionListener để đáp ứng tất cả các sự kiện kích hoạt, bao gồm Nhập, cú click chuột và các phím tắt, đó là một nhiều hơn nữa API đơn giản hóa.

Xem How to Use Buttons, Check Boxes, and Radio Buttons, How to Write an Action ListenersHow to Use Actions để biết thêm chi tiết

Bạn cũng có thể thiết lập một nút như nút "mặc định" có thể được kích hoạt khi không tập trung (do đó miễn là các thành phần hiện nay tập trung không sử dụng/tiêu thụ các Nhập key)

Xem JRootPane#setDefaultButtonHow to Use Root Panes để biết thêm chi tiết

0

Trước hết, bạn cần phải thực hiện tất cả các phương pháp từ KeyListener. Bạn chưa triển khai keyTyped và keyReleased. Một điều nữa là bạn nên kiểm tra mã khóa thay vì char chính vì char "Enter" không hiển thị, vì vậy tốt nhất bạn nên kiểm tra xem mã khóa có bằng KeyEvent.VK_ENTER hay không. Điều cuối cùng là khi bạn nhấn enter bạn cập nhật biến String kết quả nhưng bạn không hiển thị nó ở bất cứ đâu, vì vậy bạn cần phải đặt văn bản trên kết quả JLabel. Bạn cũng quên thực hiện chuyển đổi. giải thích của tôi có thể là khó hiểu nhưng dưới đây là các mã:

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); 


} 

}