[Java] Désactiver un JButton

Résolu
jebok Messages postés 371 Date d'inscription   Statut Membre -  
jebok Messages postés 371 Date d'inscription   Statut Membre -
Bonjour,

j'ai une fenêtre dans laquelle se trouvent des TextFields et un bouton "Valider". Comment faire en sorte que le bouton reste inactif (c'est-à-dire grisé avec impossibilité d'appuyer dessus) tant que tous les champs ne sont pas remplis ?

Merci de votre aide
Configuration: jdk 1.4.2

2 réponses

  1. Utilisateur anonyme
     
    Salut!

    Tu trouveras ci-dessous deux classes.

    La première (FormFillActionListener ) est un Listener qui peut enregistrer des JTextField ainsi qu'un JButton qui ne sera accessible que lorsque tous les chmaps enregistrés auprès de lui seront remplis.

    Voici le code:

    import java.awt.Component;
    import java.util.HashMap;
    import java.util.Iterator;
    
    import javax.swing.JTextField;
    import javax.swing.event.CaretEvent;
    import javax.swing.event.CaretListener;
    import javax.swing.text.JTextComponent;
    
    /*
     * Created on Aug 17, 2005
     *
     */
    
    /**
     * @author HackTrack
     *
     */
    public class FormFillActionListener implements CaretListener {
    	private Component trigger;
    	private HashMap components;
    
    	public FormFillActionListener() {
    		super();
    		trigger = null;
    		components = new HashMap();
    	}
    
    	public void caretUpdate(CaretEvent ce) {
    		JTextField jtf = (JTextField)ce.getSource();
    		Boolean filledField = new Boolean(false);
    		if (!jtf.getText().equals("")) {
    			filledField = new Boolean(true);
    		}
    		components.put(jtf, filledField);
    
    		boolean isFilled = true;
    		Iterator it = components.keySet().iterator();
    		while (it.hasNext()) {
    			JTextComponent tc = (JTextComponent)it.next();
    			if (((Boolean)components.get(tc)).booleanValue() == false) {
    				isFilled = false;
    				break;
    			}
    		}
    			this.trigger.setEnabled(isFilled);
    
    		JTextField comp = (JTextField)ce.getSource();
    		if (comp.getText() != null && !comp.getText().equals("")) {
    			components.put(comp, new Boolean("true"));
    		} else {
    			components.put(comp, new Boolean("false"));
    		}
    	}
    
    	public void registerComponent(JTextField tf) {
    		tf.addCaretListener(this);
    		components.put(tf, new Boolean(false));
    
    	}
    
    	public void unregisterComponent(JTextField tf) {
    		tf.removeCaretListener(this);
    		components.remove(tf);
    	}
    
    	public void setTriggerComponent(Component c) {
    		this.trigger = c;
    		this.trigger.setEnabled(false);
    	}
    
    }
    
    


    La seconde classe (FormFrame) est une JFrame qui te permet de tester cela.

    import java.awt.GridLayout;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    
    /*
     * Created on Aug 17, 2005
     *
     */
    
    /**
     * @author HackTracks
     *
     */
    public class FormFrame extends JFrame {
    	private JTextField lastname;
    	private JTextField firstname;
    	private JTextField comments;
    	private JButton send;
    
    	public FormFrame(String name) {
    		super(name);
    		initialize();
    	}
    
    	private void initialize() {
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    		FormFillActionListener fillListener = new FormFillActionListener();
    		JPanel formPanel = new JPanel();
    		formPanel.setLayout(new GridLayout(4, 2));
    		formPanel.add(new JLabel("Nom:"));
    		lastname = new JTextField(25);
    		fillListener.registerComponent(lastname);
    		formPanel.add(lastname);
    		formPanel.add(new JLabel("Prénom:"));
    		firstname = new JTextField(25);
    		fillListener.registerComponent(firstname);
    		formPanel.add(firstname);		
    		formPanel.add(new JLabel("Commentaire:"));
    		comments = new JTextField(40);
    		fillListener.registerComponent(comments);
    		formPanel.add(comments);
    		send = new JButton("Envoyer");
    		fillListener.setTriggerComponent(send);
    		formPanel.add(send);
    		getContentPane().add(formPanel);
    	}
    	
    
    	public static void main(String[] args) {
    		FormFrame form = new FormFrame("Test formulaire");
    		form.pack();
    		form.setVisible(true);
    	}
    }
    
    


    A toi d'adapter le code.

    ;-)
    HackTrack
    3
    1. jebok Messages postés 371 Date d'inscription   Statut Membre 51
       
      Merci beaucoup ca marche nickel !

      a+
      0
  2. Canard007 Messages postés 5954 Date d'inscription   Statut Contributeur 216
     
    le plus simple a mon sens c'est de faire une petite fonction qui quand il y a une action verifie que tous les champs sont remplis et passe le bouton en actif sinon passe le bouton en inactif.
    0
    1. jebok Messages postés 371 Date d'inscription   Statut Membre 51
       
      Oui c une bonne idée mais le problème, c'est que c un peu lourd...

      De plus, est-ce que le fait d'écrire dans un JTextField constitue une action (c'est-à-dire écoutable par un ActionListener) ?
      0