Partage
  • Partager sur Facebook
  • Partager sur Twitter

Un retour à la ligne entre deux items

    7 décembre 2009 à 20:05:36

    Bonjour à tous

    Ma question est toute simple. J'ai un JPanel dans lequel j'insère différents items (dans mon cas il s'agit d'un JLabel, d'un JComboBox et d'une JCheckBox). Le programme ne sert à rien, c'est juste pour m'entrainer. ;)

    J'ai donc mon texte suivi de ma combobox, mais je voudrais aller à la ligne quand j'ajoute ma case à cocher. Pour cela, j'ai pensé à mettre un GridLayout d'une seule colonne, puis d'ajouter les items à chaque ligne, mais ça me semble un peu lourd. Quelqu'un a une solution ?

    En gros, je voudrais avoir un JPanel composé d'un JLabel + JCombobox, puis à la ligne ma JCheckBox.

    Merci pour toute aide
    • Partager sur Facebook
    • Partager sur Twitter
      7 décembre 2009 à 20:20:36

      Citation : waouh

      mais ça me semble un peu lourd.


      lol ^^

      Tout dépend de tes besoins en ergonomie.
      Si c'est une application "juste comme ça", et bien essaie déjà avec le GridLayout.
      Ensuite dès que t'auras réussi on augmente un petit peu (tout petit peu) la difficulté en essayant avec un BoxLayout.
      Puis dès qu'on maîtrise ces deux-là, on essaie avec un GridBagLayout.

      Une fois que t'auras réussi ces trois prouesses, je pense que t'auras déjà résolu la plus grosse difficulté qui tracasse le débutant en Swing (dans le genre : "Quel Layout choisir ?").

      Bon courage et n'hésite pas à poster rechercher tes éventuelles questions sur le forum.
      • Partager sur Facebook
      • Partager sur Twitter
        7 décembre 2009 à 21:17:58

        Salut et merci de ta réponse :)

        Pourquoi "lol" ? Je ne sais pas trop distinguer les bonnes pratiques des mauvaises pour l'instant donc si je fais des bêtises c'est normal ^^

        Sinon j'ai essayé Boxlayout avec ce code :

        import java.awt.Dimension;
        
        import javax.swing.BorderFactory;
        import javax.swing.BoxLayout;
        import javax.swing.JCheckBox;
        import javax.swing.JComboBox;
        import javax.swing.JFrame;
        import javax.swing.JLabel;
        import javax.swing.JPanel;
        
        
        public class Fenetre extends JFrame
        {
        	JPanel container = new JPanel(), fieldset = new JPanel();
        	
        	JPanel contentListe = new JPanel();
        	JLabel label = new JLabel("Voici une liste : ");
        	JComboBox liste = new JComboBox();
        	
        	JCheckBox case1 = new JCheckBox("Case 1");
        	JCheckBox case2 = new JCheckBox("Case 2");
        	
        	public Fenetre()
        	{
        		this.setTitle("Liste de widgets");
        		this.setSize(400, 400);
        		this.setLocationRelativeTo(null);
        		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        		
        		fieldset.setPreferredSize(new Dimension(300, 120));
        		fieldset.setLayout(new BoxLayout(fieldset, BoxLayout.Y_AXIS));
        		
        		liste.setPreferredSize(new Dimension(100, 20));
        		liste.addItem("Bleu");
        		liste.addItem("Blanc");
        		liste.addItem("Rouge");
        		
        		contentListe.add(label);
        		contentListe.add(liste);
        		
        		fieldset.add(contentListe);
        		fieldset.add(case1);
        		fieldset.add(case2);
        		
        		fieldset.setBorder(BorderFactory.createTitledBorder(" Widgets "));
        		
        		container.add(fieldset);
        		this.setContentPane(container);
        		this.setVisible(true);
        	}
        }
        


        Le problème est que j'obtiens un décalement bizarre des cases à cocher :

        Image utilisateur


        Je ne comprends pas ce qui se passe. Pourquoi ne sont-elles pas centrées ?
        • Partager sur Facebook
        • Partager sur Twitter
          7 décembre 2009 à 22:06:40

          Il se trouve que tes cases sont alignées au centre... mais certes pas comme tu le voudrais.
          Le bord gauche des cases est pile poil au centre du conteneur.
          Pour l'alignement que tu voudrais, là il suffit de jouer avec le BoxLayout qui a quelques méthodes pour réaliser cela.
          • Partager sur Facebook
          • Partager sur Twitter
            8 décembre 2009 à 19:27:35

            Salut :)

            Je n'ai pas trouvé de méthodes concernant le layout. J'ai plutôt utilisé les méthodes setAlignmentX(Component.CENTER_ALIGNMENT) sur mes cases à cocher. Cependant, j'ai trois questions :

            1) C'est légèrement pénible à faire si je vais avoir des boutons / des cases radio ou tout autre widget, donc existe-t-il une manière radicale pour centrer tous les widgets contenus dans mon JPanel ?

            2) Pourquoi le layout du haut a été centré par défaut ? Je sais que ce qu'il contient est centré par défaut, mais pourquoi le bloc en lui-même l'est aussi ?

            3) Pourquoi est présent, entre mon layout contenant ma combobox et ma première checkbox, un gros espace ? Comment l'enlever pour que l'espace les séparant soit égal à l'espace séparant mes deux checkboxs ? Je voudrais d'ailleurs qu'il y ait le même espace entre tous mes widgets. Comment faire ?

            Merci de ton aide :)
            • Partager sur Facebook
            • Partager sur Twitter
              9 décembre 2009 à 13:19:28

              Toutes les réponses à tes questions sont dans le lien que je t'ai donné.
              Quant aux questions du type "pourquoi est-ce que c'est comme ça par défaut", ben la réponse est que les programmeurs de chez Sun ont décidé ça comme ça.
              Pour la 3/, regarde dans le lien : il me semble qu'il suffit de modifier les size des Component.
              • Partager sur Facebook
              • Partager sur Twitter
                11 décembre 2009 à 11:44:29

                Ok merci pour toutes ces informations :)

                J'ai créé mon application pour m'exercer en plaçant divers widgets grâce aux BoxLayout, et je voulais savoir si ma façon de faire était bien ou pas, car j'ai l'impression que ça fait un peu fouilli :

                import java.awt.Dimension;
                import java.awt.event.ActionEvent;
                import java.awt.event.ActionListener;
                
                import javax.swing.BorderFactory;
                import javax.swing.Box;
                import javax.swing.BoxLayout;
                import javax.swing.ButtonGroup;
                import javax.swing.JButton;
                import javax.swing.JCheckBox;
                import javax.swing.JComboBox;
                import javax.swing.JFrame;
                import javax.swing.JLabel;
                import javax.swing.JPanel;
                import javax.swing.JProgressBar;
                import javax.swing.JRadioButton;
                import javax.swing.JSlider;
                import javax.swing.JTextField;
                import javax.swing.event.ChangeEvent;
                import javax.swing.event.ChangeListener;
                
                
                public class Fenetre extends JFrame
                {
                	private JPanel container = new JPanel(), fieldset = new JPanel();
                	
                	private JPanel contentListe = new JPanel();
                	private JLabel label = new JLabel("Voici une liste : ");
                	private JComboBox liste = new JComboBox();
                	
                	private JCheckBox case1 = new JCheckBox("Case 1");
                	private JCheckBox case2 = new JCheckBox("Case 2");
                	
                	private ButtonGroup bgRadio = new ButtonGroup();
                	private JRadioButton radio1 = new JRadioButton("Radio 1");
                	private JRadioButton radio2 = new JRadioButton("Radio 2");
                	
                	private JLabel labelTextField = new JLabel("Un champ texte :");
                	private JTextField champTexte = new JTextField();
                	
                	private JLabel labelSlide = new JLabel("Slider : ");
                	private JSlider slide = new JSlider(0, 100);
                	private JProgressBar progressBar = new JProgressBar(0, 100);
                	private JLabel pourcentage = new JLabel("0%");
                	
                	private JButton valider = new JButton("Valider");
                	private JButton fermer = new JButton("Fermer");
                	
                	public Fenetre()
                	{
                		this.setTitle("Liste de widgets");
                		this.setSize(350, 300);
                		this.setLocationRelativeTo(null);
                		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                		this.setResizable(false);
                		
                		
                		// COMBOBOX
                		liste.setPreferredSize(new Dimension(100, 20));
                		
                		liste.addActionListener(new ActionListener()
                		{
                			public void actionPerformed(ActionEvent e)
                			{
                				System.out.println("Liste modifiée - nouvelle valeur : " + liste.getSelectedItem());
                			}
                		});
                		
                		liste.addItem("Bleu");
                		liste.addItem("Blanc");
                		liste.addItem("Rouge");
                		
                		contentListe.add(label);
                		contentListe.add(liste);
                		contentListe.setMaximumSize(new Dimension(250, 35));
                		
                		// CHECKBOXS
                		case1.addActionListener(new CheckListener());
                		case2.addActionListener(new CheckListener());
                		
                		JPanel groupCheckBoxs = new JPanel();
                		groupCheckBoxs.setLayout(new BoxLayout(groupCheckBoxs, BoxLayout.Y_AXIS));
                		groupCheckBoxs.add(case1);
                		groupCheckBoxs.add(case2);
                		
                		
                		// RADIO BUTTONS
                		bgRadio.add(radio1);
                		bgRadio.add(radio2);
                		
                		radio1.addActionListener(new RadioListener());
                		radio2.addActionListener(new RadioListener());
                		
                		JPanel groupRadio = new JPanel();
                		groupRadio.setLayout(new BoxLayout(groupRadio, BoxLayout.Y_AXIS));
                		groupRadio.add(radio1);
                		groupRadio.add(radio2);
                		
                		
                		// AJOUT D'UN LAYOUT CHECKBOXS + RADIOS
                		JPanel groupChecksRadios = new JPanel();
                		groupChecksRadios.setLayout(new BoxLayout(groupChecksRadios, BoxLayout.X_AXIS));
                		groupChecksRadios.add(groupCheckBoxs);
                		groupChecksRadios.add(Box.createRigidArea(new Dimension(50,0)));
                		groupChecksRadios.add(groupRadio);
                		
                		
                		// ZONE DE TEXTE
                		champTexte.setPreferredSize(new Dimension(120, 20));
                		JPanel zoneTexte = new JPanel();
                		zoneTexte.add(labelTextField);
                		zoneTexte.add(champTexte);
                
                		
                		// SLIDER
                		slide.setValue(0);
                		slide.addChangeListener(new ChangeListener()
                		{
                			public void stateChanged(ChangeEvent e)
                			{
                				int value = ((JSlider)e.getSource()).getValue();
                				
                				progressBar.setValue(value);
                				pourcentage.setText(value + "%");
                			}
                		});
                		
                		JPanel groupSlide = new JPanel();
                		groupSlide.add(labelSlide);
                		groupSlide.add(slide);
                		groupSlide.setMaximumSize(new Dimension(300, 20));
                		
                		
                		// PROGRESSBAR
                		pourcentage.setPreferredSize(new Dimension(30, 15));
                		pourcentage.setHorizontalTextPosition(JLabel.RIGHT);
                		
                		progressBar.setPreferredSize(new Dimension(210, 20));
                		
                		JPanel groupProgressBar = new JPanel();
                		groupProgressBar.add(progressBar);
                		groupProgressBar.add(pourcentage);
                		
                		
                		// BOUTONS
                		fermer.addActionListener(new ActionListener()
                		{
                			public void actionPerformed(ActionEvent e)
                			{
                				System.exit(0);
                			}
                		});
                		
                		JPanel groupButtons = new JPanel();
                		groupButtons.add(Box.createRigidArea(new Dimension(137,0)));
                		groupButtons.add(valider);
                		groupButtons.add(fermer);
                		
                		
                		// CONFIGURATION DU FIELDSET
                		fieldset.setPreferredSize(new Dimension(300, 220));
                		fieldset.setLayout(new BoxLayout(fieldset, BoxLayout.Y_AXIS));
                		fieldset.setBorder(BorderFactory.createTitledBorder(" Widgets "));
                		
                		fieldset.add(contentListe);
                		fieldset.add(groupChecksRadios);
                		fieldset.add(zoneTexte);
                		fieldset.add(groupSlide);
                		fieldset.add(groupProgressBar);
                		
                		container.add(fieldset);
                		container.add(groupButtons);
                		this.setContentPane(container);
                		this.setVisible(true);
                	}
                	
                	class CheckListener implements ActionListener
                	{
                
                		public void actionPerformed(ActionEvent e)
                		{
                			System.out.println("Checkbox " + ((JCheckBox) e.getSource()).getText() + " modifiée - état : " + (((JCheckBox) e.getSource()).isSelected() ? "cochée" : "non cochée"));
                		}
                		
                	}
                	
                	class RadioListener implements ActionListener
                	{
                
                		public void actionPerformed(ActionEvent e)
                		{
                			System.out.println("Radios changées - nouvelle valeur : " + (radio1.isSelected() ? "radio1" : "radio2"));
                		}
                		
                	}
                }
                


                Pour au final avoir :

                Image utilisateur


                J'ai une dernière question aussi. Je ne comprends pas le principe des setAlignmentX car quand je mets ALIGNMENT_RIGHT, l'élément se positionne à gauche, et inversement. Que je mette les éléments d'un même layout à CENTER_RIGHT ou CENTER_LEFT, ils s'alignent au même endroit. Quelle est la logique là-dedans ?
                • Partager sur Facebook
                • Partager sur Twitter

                Un retour à la ligne entre deux items

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown