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 :

Problème d'affichage SWING


Sujet :

AWT/Swing Java

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut Problème d'affichage SWING
    Bonjour,

    j'essaye de faire l'exo suivant :
    On souhaite créer un panneau contenant quatre cases à cocher (JCheckBox) étiquettées "zoro", "invanhoé", "spiderman" et "moi". On veut faire en sorte qu'il n'y ait qu'un seul checkbox sélectionné à la fois. Il y a deux algorithmes différents :

    1. Faire en sorte que lorsque l'on sélectionne un checkbox les autres soient automatiquement déselectionnés.
    2. Faire en sorte de déselectionner l'ancien checkbox sélectionné avant de sélectionner le nouveau.

    Il est possible d'obtenir tous les fils d'un Container (un JPanel est un Container) à l'aide des méthodes getComponentCount() et getComponent().

    Dans cette exercice, il est demandé de ne pas utiliser la classe ButtonGroup mais de programmer 'à la main' le comportement.
    Voici ce que j'ai fait :
    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
    import javax.swing.*;
     
    public class CheckBoxTest {
    	public static void main(String[] args) {
    		JFrame frame = new JFrame();
    		JCheckBox zoro = new JCheckBox("zoro");
    		JCheckBox invanhoe = new JCheckBox("invahnoe");
    		JCheckBox spiderman = new JCheckBox("spiderman");
    		JCheckBox moi = new JCheckBox("moi");
    		frame.setTitle("CheckBoxTest");
    		frame.setSize(400,300);
    		frame.setVisible(true);
    		frame.add(zoro);
    		frame.add(invanhoe);
    		frame.add(spiderman);
    		frame.add(moi);
     
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	}
     
    }
    J'obtiens une fenetre mais elle est vide
    Pourriez-vous m'aider ?

    Merci

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    http://www.inf.enst.fr/~charon/cours...g/bouton1.html recherche ->setContentPane

    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
     
    public class CheckBoxTest {
    	public static void main(String[] args) {
    		JFrame frame = new JFrame();
    JPanel panel = new JPanel();
    panel.setLayout(->@A voir par la suite sinon null);
    		JCheckBox zoro = new JCheckBox("zoro");
    		JCheckBox invanhoe = new JCheckBox("invahnoe");
    		JCheckBox spiderman = new JCheckBox("spiderman");
    		JCheckBox moi = new JCheckBox("moi");
    		frame.setTitle("CheckBoxTest");
    		frame.setSize(400,300);
    		frame.setVisible(true);
    		panel.add(zoro);
    		panel.add(invanhoe);
    		panel.add(spiderman);
    		panel.add(moi);
     
    		frame.setContentPane(panel);
     
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	}
    }

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    Salut,

    avec le code que tu as écrit, la fenetre est toujours vide

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Points : 69
    Points
    69
    Par défaut
    Salut premium,
    Le truc c'est que tu dois ajouter un panel (celui qui contient les elements graphiques) à ta fenêtre en utilisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    getContentPane().add(panel);

  5. #5
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Enlève la ligne "panel.setLayout(null)". Le layout par défaut est un FlowLayout, même si c'est pas le plus joli, ça a l'avantage de marcher.

  6. #6
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    Le code écrit comme ceci m'affiche les 4 boutons que je peux cocher :
    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
    import javax.swing.*;
     
    public class CheckBoxTest {
    	public static void main(String[] args) {
    		JFrame frame = new JFrame();
    		JPanel panel = new JPanel();
    		JCheckBox zoro = new JCheckBox("zoro");
    		JCheckBox invanhoe = new JCheckBox("invahnoe");
    		JCheckBox spiderman = new JCheckBox("spiderman");
    		JCheckBox moi = new JCheckBox("moi");
    		frame.setTitle("CheckBoxTest");
    		frame.setSize(400,300);
    		frame.setVisible(true);
    		panel.add(zoro);
    		panel.add(invanhoe);
    		panel.add(spiderman);
    		panel.add(moi);
    		frame.getContentPane().add(panel);
     
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	}
    }
    Je voudrais savoir comment faire pour que lorsque je coche une case, l'autre est désélectionné car pour l'instant, je peux cocher les 4

    Merci

  7. #7
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Il te faut utiliser un ItemListener. Tu ajoutes le même ItemListener à toutes tes checkboxes, cet ItemListener agit en fonction :
    - de la source de l'évenement
    - de l'etat porté par l'évenement

    Et si il le faut il désactive tous les checkboxes différents de la source de l'évenement.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Points : 69
    Points
    69
    Par défaut
    Tu peux grouper tes boutons afin d'obliger qu'un seul soit selectionné en meme temps, je crois que c'est GroupBox mais je sais plus, si tu trouves pas demande moi je sortirais mes vieux programmes

  9. #9
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Citation Envoyé par iutcien
    Tu peux grouper tes boutons afin d'obliger qu'un seul soit selectionné en meme temps, je crois que c'est GroupBox
    C'est la classe ButtonGroup, et si tu avais lu l'énoncé jusqu'au bout, tu saurais qu'il n'a pas le droit de s'en servir .

    Bon en fait moi aussi c'est la première chose que j'allais lui dire, mais j'ai eu un doute : les profs devraient connaître cette classe ... Alors seulement là, j'ai lu l'énoncé en entier .

  10. #10
    Membre confirmé Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Points : 465
    Points
    465
    Par défaut
    Salut salut! i tu ne trouve pas de solution avec ButtonGroup: il y a les ActionListener qui font pareil.
    J'ajoute donc dans le code que tu as donné:
    Citation Envoyé par Premium
    Le code écrit comme ceci m'affiche les 4 boutons que je peux cocher :
    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
    import javax.swing.*;
    
    public class CheckBoxTest {
    	public static void main(String[] args) {
    		JFrame frame = new JFrame();
    		JPanel panel = new JPanel();
    		JCheckBox zoro = new JCheckBox("zoro");
    		JCheckBox invanhoe = new JCheckBox("invahnoe");
    		JCheckBox spiderman = new JCheckBox("spiderman");
    		JCheckBox moi = new JCheckBox("moi");
    		frame.setTitle("CheckBoxTest");
    		frame.setSize(400,300);
    
    // Il y a besoin de statuer chaque événement sur la case à cocher
    // pour cela tu utilises un Listener en général
                   // pour zoro tu modifies spiderman, par exemple
                   zoro.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {
             spiderman.setSelected(false); // et voilà
    }});
    // tu peux répéter ce code sur chaque case à cocher ou pour tout autre composant Swing qui permet d'être actionné 
    		frame.setVisible(true);
    		panel.add(zoro);
    		panel.add(invanhoe);
    		panel.add(spiderman);
    		panel.add(moi);
    		frame.getContentPane().add(panel);
    		
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	}
    }
    Je voudrais savoir comment faire pour que lorsque je coche une case, l'autre est désélectionné car pour l'instant, je peux cocher les 4

    Merci

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Points : 69
    Points
    69
    Par défaut
    désolé tjs la flemme de lire jusqu'au bout ...
    Bon moi je pense que broumbroum à dit la methode la plus simple.
    Je sais pas à quel niveau tu en es (faut il faire mvc?) mais moi je ferait une classe MaClasseListener avec la redefinition de ActionListener().
    Dedans tu deselectionnes toutes les autres checkbox en utilisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int max=panelPrincipale.getComponentCount();
    for(int i=0;i<max;i++)
    {
       Component comp=panelPrincipale.getComponent(i);
       if( comp instanceof JCheckBox && comp!= argument.getSource())
            ((JCheckBox)comp).setSelected(false);
    }
    A verifier bien sur!

Discussions similaires

  1. Problème d'affichage des fichiers Swing
    Par Richard_Rahl dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 07/05/2007, 10h21
  2. problème du pause (sleep) ou problème vitesse d'affichage (Swing)
    Par MAD_Tarik dans le forum EDT/SwingWorker
    Réponses: 15
    Dernier message: 17/04/2007, 13h47
  3. [Swing] Problème d'affichage dans un JScrollPane
    Par Adrien22 dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 05/04/2006, 14h36
  4. [Swing]Problème d'affichage sur un JTree
    Par tomca dans le forum Composants
    Réponses: 4
    Dernier message: 19/01/2006, 10h41
  5. [Swing] problème d'affichage
    Par l'obstiné dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 21/08/2004, 18h05

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