2013-01-13 26 views
5

Sto provando a creare un programma che converta fahrenheit in celcius in java. Nel programma ho 2 etichette e 1 campo di testo per l'input. Voglio convertire la temperatura quando l'utente digita la temperatura e preme Immettere. Per fare ciò, ho aggiunto un ascoltatore chiave al mio campo di testo, ma non funziona. Quando si preme Immettere il listener non attivare affatto.KeyListener in Textfield non si attiva quando si preme Invio

Ed ecco il mio codice.

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: Funziona con ActionListener ma ho bisogno di farlo con classe anonima. Senza classe anonima spara con Inserisci.

+2

L'evento è stato consumato più in alto nella catena di eventi, quindi è mai raggiungendo, meglio usare [combinazioni di tasti] (http://docs.oracle .com/javase/tutorial/uiswing/misc/keybinding.html) - In realtà, è meglio usare un 'ActionListener' per quello che stai cercando di fare - questo è quello per cui è stato progettato - ricorda, [Invio] non è sempre il" accetta "chiave per ogni piattaforma;) – MadProgrammer

+0

Sono stato tentato di utilizzare il listener di azioni. Tutto è andato così bene fino a quando non riesco a trovare come controllare se il tasto di invio viene premuto o meno in ActionListener. – Miral

+2

Ha importanza? Da un punto di vista indipendente dalla piattaforma, l'ActionListener verrà attivato quando l'utente attiva l'azione "accetta" per quella piattaforma. Succede solo che per la maggior parte delle piattaforme, è il tasto [Invio]. – MadProgrammer

risposta

4

Provare e.getKeyCode() anziché e.getKeyChar(). La costante KeyEvent.VK_ENTER è un int, non un char.

In altre parole:

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

invece di

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

Bei suggerimenti, ma, * "Quando premo invio di listener non si attiva affatto" * il tasto [Invio] viene consumato più in alto nella catena di eventi, il che significa che il listener non viene mai attivato - [Invio] viene utilizzato da il campo di testo per qualcos'altro e viene consumato – MadProgrammer

+0

Questo è vero, anche se presumo che stiano valutando se l'ascoltatore si attiva o meno, indipendentemente dal fatto che l'istruzione if faccia effettivamente stampare un output. Forse non avrei dovuto fare una simile ipotesi ... – Sinkingpoint

+0

Sì, ho provato anche quello, ma non ha funzionato. – Miral

0

risposta tardi, ma ho provato con il codice in questione e la keyPressed fatto grilletto, ma il perché la JLabel non ha aggiornamento, si presuppone che KeyEvent non sia stato attivato.

Subito dopo

outcome = input.getText(); 

aggiungere

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

con l'etichetta si aggiornerà.

0

I tasti non hanno bisogno di un KeyListener (e per la maggior parte non li dovrebbero usare), usano un ActionListener per rispondere a tutti gli eventi di attivazione, compreso Inserisci, clic del mouse e tasti di scelta rapida, è un molto più API semplificata.

Vedi How to Use Buttons, Check Boxes, and Radio Buttons, How to Write an Action Listeners e How to Use Actions per maggiori dettagli

È anche possibile impostare un pulsante come il pulsante "default" che può essere attivato quando non è messo a fuoco (fino a quando il componente attualmente focalizzato non usa/consumare il Enter chiave)

Vedi JRootPane#setDefaultButton e How to Use Root Panes per maggiori dettagli

0

Prima di tutto, è necessario implementare tutti i metodi da KeyListener. Non hai implementato keyTyped e keyReleased. Un'altra cosa è che dovresti controllare il codice chiave invece del carattere chiave perché il carattere "Invio" non è visibile, quindi preferibilmente dovresti controllare se il codice chiave è uguale a KeyEvent.VK_ENTER. L'ultima cosa è quando premi invio, aggiorni la variabile stringa del risultato ma non la mostri da nessuna parte, quindi devi impostare il testo sul risultato JLabel. Hai anche dimenticato di fare la conversione. La mia spiegazione potrebbe essere fonte di confusione, ma sotto è il codice:

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


} 

}