IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

GridbagLayout et gestion des JButton


Sujet :

AWT/Swing Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2017
    Messages : 3
    Points : 2
    Points
    2
    Par défaut GridbagLayout et gestion des JButton
    Bonjour
    Je sollicite votre aimable support pour le point suivant :
    1) j'ai crée un GridBagLayout (matrice) contenant des JButton sans souci
    2) Je n'arrive pas à implémenter le mode opératoire suivant :
    a) l'utilisateur clique sur un JButton (bouton J1 de coordonnées (a,b) dans le Grid) pour le sélectionner : jusqu'ici tout va bien en utilisant la capture d'un évènement souris
    b) l'utilisateur doit ensuite sélectionner un autre JButton (bouton J2 de coordonnées (c,d) dans le Grid)
    c) le programme doit effacer le bouton J2 et le remplacer par le bouton J1

    C'est ce lien entre les 2 clic que je n'arrive pas à implémenter

    Je vous remercie par avance de votre support

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Il te suffit d'utiliser le même écouteur (la même instance) pour tous les boutons, avec un attribut qui mémorise le bouton sélectionné, lors de la sélection du second bouton, tu testes s'il y a une sélection mémorisée ou pas, et selon, tu fais l'action.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    public class GBLBDemo {
     
    	public static void main(String[] args) {
     
                    // Une fenêtre avec un GridBagLayout		
    		JFrame frame = new JFrame("Démo");
    		frame.getContentPane().setLayout(new GridBagLayout());
     
    		ActionListener actionListener = new ActionListener() {
     
    			private final Border selectionBorder = BorderFactory.createLineBorder(Color.RED,2); // pour marque la sélection
    			private JComponent current; // le bouton actuellement sélectionné
    			private Border currentBorder; // la bordure du bouton actuellement sélectionné pour la restaurer
     
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				if ( e.getSource()==current ) { // si le nouveau bouton est celui qui est actuellement sélectionné, on déselectionne ce bouton
    					current.setBorder(currentBorder);
    					current=null;
    				}
    				else { // sinon
    					JComponent button = (JComponent)e.getSource(); // on relève le bouton cliqué
    					if ( current==null ) { // s'il n'y a pas déjà un bouton sélectionné, le bouton cliqué devient sélectionné
    						current = button; 
    						currentBorder = button.getBorder(); // on sauvegarde la bordure actuel du bouton pour pouvoir la restaurer
    						current.setBorder(selectionBorder); // on marque la sélection avec une bordure rouge
    					}
    					else { // sinon
    						GridBagConstraints gbc = ((GridBagLayout)frame.getContentPane().getLayout()).getConstraints(button); // on relève la "position" du bouton cliqué
    						frame.getContentPane().remove(button); // on retire le bouton cliqué de son container (on l'efface donc)
    						current.setBorder(currentBorder); // on restaure la bordure du bouton
    						((GridBagLayout)frame.getContentPane().getLayout()).setConstraints(current, gbc); // on repositionne le bouton sélectionné à l'emplacement du bouton "effacé"
    						current=null; // on annule la sélection du premier bouton
    					}
    				}
    			}
     
    		};
     
                    // j'ajoute 100 boutons au content pane, avec le même ActionListener pour tous
    		Insets insets=new Insets(0, 0, 0, 0);
    		for(int i=0; i<100; i++) {
    			JButton button = new JButton(String.valueOf(i+1));
    			GridBagConstraints gbc = new GridBagConstraints(i%10,i/10,1,1,1,1,GridBagConstraints.CENTER,GridBagConstraints.BOTH,insets,0,0);
    			button.addActionListener(actionListener);
    			frame.getContentPane().add(button, gbc);
    		}
     
                    // affichage de la fênêtre
    		frame.pack();
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2017
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Salut
    Je te remercie pour tes explications et ta proposition de code car c'est toujourrs plus facile de s'accrocher à un exemple
    J'ai lancé ton programme (en rajoutant final JFrame car sinon Eclipse ne passait pas) mais il ne semble pas bien fonctionner chez moi
    Quand je clique sur 1 et ensuite sur 2 : mon attente c'etait que 1 et 2 soient permutés; dans le programme attaché, le 1 est bien mis en lieu et place du 2 mais la place du 1 est maintenant "vide" c'est-à-dire sans aucun bouton ?

    En fait, je me rends compte que mon messsage initial n'était pas suffisamment clair
    => c) le programme doit permuter les boutons J2 et J1

    désolé

    Merci pour ton support

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Proximus Voir le message
    J'ai lancé ton programme (en rajoutant final JFrame car sinon Eclipse ne passait pas) mais il ne semble pas bien fonctionner chez moi
    Ça, c'est parce que tu n'es pas en Java 8 (il n'y a plus de mises à jour pour les versions précédentes et plus de support public, la 7 depuis avril 2015, il serait donc temps de passer à Java 8, 2 ans après l'arrêt des mises à jours).
    Citation Envoyé par Proximus Voir le message
    Quand je clique sur 1 et ensuite sur 2 : mon attente c'etait que 1 et 2 soient permutés; dans le programme attaché, le 1 est bien mis en lieu et place du 2 mais la place du 1 est maintenant "vide" c'est-à-dire sans aucun bouton ?
    Citation Envoyé par Proximus Voir le message
    En fait je me rends compte que lon msg initial n'etait pas suffisamment clair
    => c) le programme doit permuter les boutons J2 et J1
    Voilà, tu t'es répondu à toi-même

    Il te suffit donc de changer légèrement le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    @Override
    public void actionPerformed(ActionEvent e) {
        if ( e.getSource()==current ) {
            current.setBorder(currentBorder);
            current=null;
        }
        else {
            JComponent button = (JComponent)e.getSource();
            if ( current==null ) {
                current = button;
                currentBorder = button.getBorder();
                current.setBorder(selectionBorder);
            }
            else {
                // on récupère les emplacements des 2 boutons
                GridBagConstraints gbcButton = ((GridBagLayout)frame.getContentPane().getLayout()).getConstraints(button); 
                GridBagConstraints gbcCurrent = ((GridBagLayout)frame.getContentPane().getLayout()).getConstraints(current);
                current.setBorder(currentBorder);
                ((GridBagLayout)frame.getContentPane().getLayout()).setConstraints(current, gbcButton); // on place button à l'emplacement de current
                ((GridBagLayout)frame.getContentPane().getLayout()).setConstraints(button, gbcCurrent); // on place current à l'emplacement de button
                // current.requestFocus(); // remet le focus sur le bouton sous la souris, ça peut être plus cohérent
                current=null;
            }
        }
    On pourrait procéder plus simplement aussi en échangeant juste les textes des deux boutons. Echanger les composants à l'avantage d'être sûr que tous les attributs des boutons sont bien échangés, avec un code unique (par exemple, si au lieu de textes, on mettais des images, il faudrait changer l'échange des textes, par l'échange d'images...).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2017
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci Joel
    Efficace, clair et précis
    Bien à toi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. gestion des groupes
    Par muaddib dans le forum QuickReport
    Réponses: 3
    Dernier message: 31/12/2002, 12h01
  2. [reseaux] Gestion des threads en perl
    Par totox17 dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 28/11/2002, 10h40
  3. Gestion des variables - mémoire ?
    Par RIVOLLET dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2002, 13h44
  4. Réponses: 4
    Dernier message: 04/07/2002, 13h31
  5. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 15h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo