2016-03-26 4 views
-1

Donc je viens de commencer à lire sur DocumentListeners et d'autres écouteurs d'action aujourd'hui mais je ne peux pas obtenir mon JButton pour revenir à l'état setEnabled(false) lorsque l'un des champs de texte est vide. Est-ce que cela a quelque chose à voir avec la position du curseur ou existe-t-il un moyen approprié de revenir à l'état original setEnabled(false) lorsque l'un des champs de texte est vide.Comment spécifier l'état JButton si le document de JTextField est vide

Voici ce que j'ai écrit jusqu'à maintenant.

public class home extends javax.swing.JPanel { 
    public home() { 
     JPasswordField currentPasswordJPasswordField; 
     JPasswordField newPasswordJPasswordField; 
     JPasswordField reTypeNewPasswordJPasswordField; 

     currentPasswordJPasswordField.getDocument().addDocumentListener(new textFieldListener(saveNewPasswordButton)); 
     newPasswordJPasswordField.getDocument().addDocumentListener(new textFieldListener(saveNewPasswordButton)); 
     reTypeNewPasswordJPasswordField.getDocument().addDocumentListener(new textFieldListener(saveNewPasswordButton)); 
    } 

    public static class textFieldListener implements DocumentListener { 
     JButton btn; 

     public textFieldListener(JButton button) { 
      btn = button; 
     } 

     @Override 
     public void insertUpdate(DocumentEvent e) { 
      btn.setEnabled(true); 
     } 

     @Override 
     public void removeUpdate(DocumentEvent e) { 
      btn.setEnabled(true); 
     } 

     @Override 
     public void changedUpdate(DocumentEvent e) { 
      btn.setEnabled(true); 
     } 
    } 
} 

Lorsque je tape quelque chose sur le champ de texte, il active le bouton de sauvegarde comme prévu. Mais lorsque j'appuie sur le retour arrière pour effacer tout le texte, le bouton de sauvegarde ne retourne pas àsetEnabled(false).

J'apprécierais toute réponse. Je viens de commencer à apprendre cela. Je veux aussi savoir si je peux placer les écouteurs d'action dans un fichier .java séparé. Si oui, comment puis-je appliquer les auditeurs à ma classe principale.

Merci.

+0

Pour une meilleure aide plus tôt, un poster [MCVE] ou [Short, Self Contained, Correct Example] (http://www.sscce.org/). –

+0

@AndrewThompson Je vais prendre note de cela. J'ai édité mon post aussi concis que possible. Je suppose que c'est le plus court et le plus concis possible. Je vous remercie. – p3ace

+0

Vous remarquerez peut-être qu'il y a plus de MCVE que de 'Minimal', plus de SSCCE que de 'Short'. Ce sont les autres parties que je vous suggère d'afficher le code postal. Code postal, nous pouvons compiler, exécuter et * voir le problème. * –

Répondre

1

Vous pouvez ajouter un KeyListener à chacun des champs de texte et mettre à jour le bouton depuis l'intérieur de la classe interne anonyme.

currentPasswordJPasswordField.addKeyListener(new KeyAdapter() { 
    public void keyReleased(KeyEvent e) { 
     super.keyReleased(e); 
     if(currentPasswordJPasswordField.getText().length() > 0 && 
       newPasswordJPasswordField.getText().length() > 0 && 
       reTypeNewPasswordJPasswordField.getText().length() > 0) { 
      btn.setEnabeld(true); 
     } else { 
      btn.setEnabled(false); 
     } 
    } 
}); 

newPasswordJPasswordField.addKeyListener(new KeyAdapter() { 
    public void keyReleased(KeyEvent e) { 
     super.keyReleased(e); 
     if(currentPasswordJPasswordField.getText().length() > 0 && 
       newPasswordJPasswordField.getText().length() > 0 && 
       reTypeNewPasswordJPasswordField.getText().length() > 0) { 
      btn.setEnabeld(true); 
     } else { 
      btn.setEnabled(false); 
     } 
    } 
}); 

reTypeNewPasswordJPasswordField.addKeyListener(new KeyAdapter() { 
    public void keyReleased(KeyEvent e) { 
     super.keyReleased(e); 
     if(currentPasswordJPasswordField.getText().length() > 0 && 
       newPasswordJPasswordField.getText().length() > 0 && 
       reTypeNewPasswordJPasswordField.getText().length() > 0) { 
      btn.setEnabeld(true); 
     } else { 
      btn.setEnabled(false); 
     } 
    } 
}); 
+0

Je vais essayer ça. Je ne savais pas qu'il y a un auditeur clé. Je suis en train de lire la documentation sur https://docs.oracle.com/javase/tutorial/uiswing/events/api.html. Je vais ajouter un commentaire si cela fonctionne. Je vous en suis reconnaissant. Merci. – p3ace

+0

Oui c'est la voie à suivre. –

+2

Et que se passe-t-il si je colle du texte dans le champ ou si je mets le champ à jour par programmation? Le 'KeyListener' ne peut pas gérer ces cas d'utilisation – MadProgrammer

4

Votre approche de base est correcte, en utilisant un DocumentListener, mais vous ne semblez pas être vérifier la longueur du contenu du Document à tout moment

Ceci est un exemple très simple, mais jusqu'à ce que les trois champs ont quelque chose, le bouton ne sera pas activé.

Vous pouvez étendre l'idée en vérifiant aussi pour voir si les deux premiers champs correspondent, mais je vais laisser ça à vous

import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JPasswordField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import javax.swing.text.Document; 
import javax.swing.text.JTextComponent; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private JPasswordField currentPasswordJPasswordField; 
     private JPasswordField newPasswordJPasswordField; 
     private JPasswordField reTypeNewPasswordJPasswordField;  

     private List<JTextComponent> requiredFields = new ArrayList<>(25); 

     private JButton okay; 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.insets = new Insets(2, 2, 2, 2); 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 

      currentPasswordJPasswordField = makePasswordField(); 
      newPasswordJPasswordField = makePasswordField(); 
      reTypeNewPasswordJPasswordField = makePasswordField(); 

      add(currentPasswordJPasswordField, gbc); 
      add(newPasswordJPasswordField, gbc); 
      add(reTypeNewPasswordJPasswordField, gbc); 

      okay = new JButton("Ok"); 
      add(okay); 

      updateState(); 
     } 

     protected JPasswordField makePasswordField() { 
      JPasswordField field = new JPasswordField(20); 
      field.getDocument().addDocumentListener(new DocumentHandler()); 
      requiredFields.add(field); 
      return field; 
     } 

     protected void updateState() { 
      boolean enabled = true; 
      for (JTextComponent field : requiredFields) { 
       if (field.getDocument().getLength() == 0) { 
        enabled = false; 
        break; 
       } 
      } 
      okay.setEnabled(enabled); 
     } 

     public class DocumentHandler implements DocumentListener { 

      @Override 
      public void insertUpdate(DocumentEvent e) { 
       updateState(); 
      } 

      @Override 
      public void removeUpdate(DocumentEvent e) { 
       updateState(); 
      } 

      @Override 
      public void changedUpdate(DocumentEvent e) { 
       updateState(); 
      } 

     } 

    } 

}