2010-09-03 6 views
3

J'essaie d'apprendre quelque chose sur l'interface graphique, en utilisant NetBeans6.8, en commençant par la section GUI dans le tutoriel java.Événement KeyPressed

Il existe un exercice simple pour un convertisseur Celsius-Fahrenheit. Je veux que cela ait deux TextFields, un pour Celsius et un pour la température Fahrenheit; Si l'utilisateur tape dans le champ de texte Celsius, il obtient le résultat "imprimé" dans le texte en fahrenheit. et vice versa.

Alors, je mets à la fois la textfields un événement keyTyped, voici le code:

private void celsiusTextKeyTyped(java.awt.event.KeyEvent evt) {         
    int cels = Integer.parseInt(celsiusText.getText()); 
    int fahr = (int)(cels * 1.8 + 32); 
    fahrText.setText(fahr + ""); 
}          

private void fahrTextKeyTyped(java.awt.event.KeyEvent evt) {         
    int fahr = Integer.parseInt(fahrText.getText()); 
    int cels = (int)(fahr/1.8 - 32); 
    celsiusText.setText(cels + ""); 
} 

Il ne fonctionne pas. Si je tape quelque chose dans un champ de texte j'ai eu cette exception: java.lang.NumberFormatException: For input string: ""

Le code qui attache les auditeurs: [. Cependant, je ne peux pas le modifier, il est AutoGénéré]

celsiusText.addKeyListener(new java.awt.event.KeyAdapter() { 
    public void keyTyped(java.awt.event.KeyEvent evt) { 
     celsiusTextKeyTyped(evt); 
    } 
}); 

fahrText.addKeyListener(new java.awt.event.KeyAdapter() { 
    public void keyTyped(java.awt.event.KeyEvent evt) { 
     fahrTextKeyTyped(evt); 
    } 
}); 

Répondre

1

Méthode .getText() renvoie une chaîne qui n'est pas un nombre, si cette chaîne contient des caractères non numériques (c'est-à-dire une lettre, un espace, rien du tout) alors parseInt lancera une exception NumberFormatException. Depuis que vous utilisez KeyEvent, dès que vous appuyez sur "7", l'événement est déclenché avant que 7 soit entré dans la zone de texte. Ainsi, la zone de texte contient toujours "", qui est l'origine de l'erreur. Vous pouvez également écouter l'événement keyUp à la place.

Vous devez placer votre code dans un bloc try catch.

private void fahrTextKeyTyped(java.awt.event.KeyEvent evt) 
{ 
    try 
    {        
     int fahr = Integer.parseInt(fahrText.getText()); 
     int cels = (int)(fahr/1.8 - 32); 
     celsiusText.setText(cels + ""); 
    } 
    catch(NumberFormatException ex) 
    { 
     //Error handling code here, i.e. informative message to the user 
    } 
} 

Une alternative est que vous pouvez filtrer les non-numéros sur l'événement keydown, voir exemple ici - http://www.javacoffeebreak.com/java107/java107.html (Création d'un composant personnalisé - NumberTextField)

+0

Integer.parseInt() prend un String et retourne un int ... Vouliez-vous dire s'il n'a pas de "chaîne numérique"? – antonyt

+1

Je recommande fortement d'utiliser NumberFormatException au lieu de l'exception globale, et d'imprimer la trace de la pile aussi. Néanmoins ceci ne résout pas le problème le cache seulement. –

+0

@Vash, je ne peux pas être plus d'accord, était juste de sauter dans une solution rapide. J'ai édité la solution pour correspondre;) @antonyt, "3" = 3, "63" = 63, "0" = 0, "a" = ERREUR, "" = ERREUR. – JonWillis

0

Vous l'action probablement mis à keyDown, cela veut dire que même se produire avant que la valeur de clé soit "ajoutée" à la zone de texte, pendant que vous en récupérez la valeur est encore vide "".

1

Je suppose que ce qui est arrivé, c'est que vous avez ajouté ces gestionnaires avec quelque chose comme celsiusText.addKeyListener, oui? Le fait est que cela vous donnera non seulement les événements KEY_TYPED que vous vouliez, mais aussi KEY_DOWN et KEY_UP. L'événement KEY_DOWN se produira avant que le texte ne soit réellement entré dans le champ, donc votre code tirant dessus verra le champ vide. Essayer de convertir la chaîne vide en un nombre vous donne une exception de format.

La méthode la plus simple pour résoudre ce problème est la construction try/catch que d'autres personnes ont posté.

0

Il y a un exercice simple pour un convertisseur Celsius-Fahrenheit

C'est un exemple vraiment vieux. La meilleure approche consiste à utiliser un DocumentListener, pas un KeyListener.

Questions connexes