2011-10-30 7 views
3

Désolé pour mon anglais. J'ai quelques problèmes avec JTextField et avec KeyListener. J'ai le code ci-dessous:KeyListener ne fonctionne pas avec JTextField

package com.gugnovich.tasks; 
@SuppressWarnings("serial") 
public class Task1Panel extends Task { 

    private static final String zLabel = "Please enter Z:"; 
    private static final String eLabel = "Please enter E:"; 
    private static final double K = 1.4; 

    private JTextField zField; 
    private JTextField eField; 
    private JTextField result; 

    private double zVal; 
    private double eVal; 
    private double resultVal; 


    @Override 
    protected void displayTaskPanel() { 
     /** Panel settings */ 
     setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 
     setBorder(new EmptyBorder(10, 15, 10, 10)); 
     /** Add title of the task */ 
     JLabel title = new JLabel(Constants.TASK1_TITLE + ":"); 
     title.setFont(new Font("Monospaced", Font.BOLD, 18)); 
     add(title); 
      /** 
       Form builder 
      */ 
     DefaultFormBuilder builder = new DefaultFormBuilder(new FormLayout("")); 
     builder.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
     builder.setBackground(Color.decode(Constants.BACKGROUND_COLOR)); 
      /** 
       Add columns 
      */ 
     builder.appendColumn("left:pref"); 
     builder.appendColumn("3dlu"); 
     builder.appendColumn("fill:max(pref; 100px)"); 

     builder.appendSeparator("Enter params"); 
      /** 
       Field for Z 
      */ 
     zField = new JTextField(); 
     builder.append(zLabel, zField); 
     zField.addKeyListener(listener); 
      /** 
       Field for E 
      */ 
     eField = new JTextField(); 
     builder.append(eLabel, eField, true); 
     eField.addKeyListener(listener); 

     builder.appendSeparator("Result"); 
      /** 
       result field 
      */ 
     result = new JTextField(); 
     result.setEnabled(false); 
     result.setDisabledTextColor(Color.BLACK); 
     builder.append("X = ", result); 

     add(builder.getPanel()); 
    } 
    /** 
    listener 
    */ 
    private KeyListener listener = new KeyListener() { 

     @Override 
     public void keyTyped(KeyEvent e) { 
      System.out.println("Typed"); 
      JTextField zf = (JTextField) e.getSource(); 
      zVal = Double.parseDouble(zf.getText()); 
      JTextField ef = (JTextField) e.getSource(); 
      eVal = Double.parseDouble(ef.getText()); 
      if (zVal > 0.00 && eVal > 0.00) { 
       calculate(); 
      } 
     } 

     @Override 
     public void keyReleased(KeyEvent e) { 
      System.out.println("Released"); 
     } 

     @Override 
     public void keyPressed(KeyEvent e) { 
      System.out.println("Pressed"); 
     } 
    }; 

} 

Le problème est que l'auditeur ne fonctionne pas. Quelle pourrait-être la cause? Si j'ajouterai l'écouteur de souris cela fonctionne. Merci d'avance. Ne pas utiliser un KeyListener pour cela.

+0

Définir l'expression « ne fonctionne pas ». Ce qui se produit? –

+2

Et vous auriez rarement besoin d'utiliser un KeyListener avec un JTextField. Plus souvent vous utiliserez un DocumentFilter si vous avez besoin de saisir une entrée avant qu'elle ait été validée ou un DocumentListener pour après. –

+0

Après une brève révision de votre code, je n'utiliserais pas une clé ou un écouteur de souris ici mais j'ajouterais plutôt un JButton à l'interface graphique et extrairais les données des champs et j'appellerais calculer depuis wih dans l'écouteur d'action du bouton. Essayez de garder les choses simples. –

Répondre

6

Souvent, j'utilise un DocumentListener pour écouter le Document de JTextField si je veux réagir aux changements après qu'ils ont été placés dans le JTextField, mais même cela ne convient pas à ce type de problème puisque vous essayez de calculer avant que les champs aient été entièrement remplis, et initialement avant que l'un des JTextFields ait reçu des données. Il vaudrait mieux ajouter un JButton à votre interface graphique et, dans ce dernier, extraire et analyser le texte de JTextFields, appeler la méthode calculate et afficher les résultats du calcul. De cette façon, vous n'obtiendrez pas de résultats prématurés, mais vous ferez seulement les calculs après que l'utilisateur a entré des informations et décidé que les données entrées sont valides et qu'il est maintenant temps de faire des calculs. Vous pouvez même désactiver le bouton jusqu'à ce que les deux JTextFields contiennent des données (un DocumentListener peut bien fonctionner pour cela).