web-dev-qa-db-fra.com

java Alignement du panneau BoxLayout

J'ai parcouru le site et je n'ai pas trouvé de solution spécifiquement adaptée à ma situation. J'ai un panneau que j'affiche dans une boîte de dialogue:

//create dialog panel
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.add(headerPanel);
panel.add(type1Panel);
panel.add(type2Panel);
panel.add(type3Panel);
panel.add(type4Panel);
panel.add(type5Panel);
panel.add(type6Panel);

int result = JOptionPane.showConfirmDialog(null, panel, "Please enter values.", JOptionPane.OK_CANCEL_OPTION);

La taille des deux derniers panneaux, type5 et type6, sont de taille égale, donc ils ont l'air bien. Cependant, l'en-tête et les 4 premiers panneaux sont de tailles différentes et je voudrais qu'ils soient tous alignés à gauche. Pour l'instant, je n'ai pas trouvé de bonne solution pour résoudre ce problème.

La question est, comment puis-je aligner les 5 premiers panneaux, mais pas les 2 derniers? Sinon, comment puis-je les aligner tous? Setalignmentx () n'est pas disponible pour les panneaux. J'ai essayé d'utiliser GridLayout, mais la largeur de la fenêtre principale de l'interface graphique est plutôt grande et ne s'adapte pas bien à l'écran, d'où le BoxLayout le long de l'axe Y. Merci pour toute aide ou suggestion.

12
whitewolfpgh

Voici un exemple qui alignera à gauche tous les JPanels ajoutés au panneau utilisé comme conteneur.

   JPanel a = new JPanel();
   JPanel b = new JPanel();
   JPanel c = new JPanel();

   a.setBackground( Color.RED );
   b.setBackground( Color.GREEN  );
   c.setBackground( Color.BLUE );

   a.setMaximumSize( new Dimension(  10, 10) );
   b.setMaximumSize( new Dimension(  50, 10) );

   a.setAlignmentX( Component.LEFT_ALIGNMENT );//0.0
   b.setAlignmentX( Component.LEFT_ALIGNMENT );//0.0
   c.setAlignmentX( Component.LEFT_ALIGNMENT );//0.0

   JPanel panel = new JPanel();
   panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
   panel.add(a);
   panel.add(b);
   panel.add(c); 

   int result = JOptionPane.showConfirmDialog(null, panel, "Please enter values.", JOptionPane.OK_CANCEL_OPTION);
26
cdc

Créez un objet javax.swing.Box horizontal pour contenir chaque objet typenPanel. En utilisant des entretoises horizontales et de la colle, vous pouvez faire ce que vous voulez:

Box  b1 = Box.createHorizontalBox();
b1.add( type1Panel );
b1.add( Box.createHorizontalGlue() );
panel.add( b1 );

Pour plus de simplicité, écrivez une méthode d'assistance pour le faire pour vous:

private Component leftJustify( JPanel panel )  {
    Box  b = Box.createHorizontalBox();
    b.add( panel );
    b.add( Box.createHorizontalGlue() );
    // (Note that you could throw a lot more components
    // and struts and glue in here.)
    return b;
}

Ensuite:

panel.add( leftJustify( headerPanel ) );
panel.add( leftJustify( type1Panel ) );
panel.add( leftJustify( type2Panel ) );

etc .... Vous pouvez devenir plus chic avec chaque ligne, en ajoutant des composants, de la colle et des entretoises. J'ai eu beaucoup de chance d'imbriquer profondément des boîtes verticales et horizontales et d'écrire des méthodes d'aide lorsque je veux faire la même disposition dans une boîte plus d'une fois. Il n'y a aucune limite à ce que vous pouvez faire, en mélangeant les composants, les entretoises et la colle si nécessaire.

Je suis sûr qu'il existe une meilleure façon de faire tout cela, mais je ne l'ai pas encore trouvé. Et le redimensionnement dynamique permet à un utilisateur avec de petits morceaux de texte d'utiliser une petite fenêtre et un utilisateur avec beaucoup de texte de le redimensionner pour qu'il corresponde parfaitement.

13
RalphChapin

Vous devez utiliser setAlignmentX sur les panneaux car il est disponible pour JPanel. Les méthodes setAlignmentX et setAlignmentY se trouvent dans JComponent, que JPanel étend. Cela fonctionne ... J'ai du code qui utilise ces méthodes pour aligner JPanels dans un BoxLayout.

D'accord, modifiez votre question pendant que j'y réponds :)

Au lieu d'utiliser un JPanel, essayez d'utiliser un Box . J'ai trouvé la classe Box très utile comme conteneur. Depuis l'API:

Un conteneur léger qui utilise un objet BoxLayout comme gestionnaire de disposition. Box fournit plusieurs méthodes de classe qui sont utiles pour les conteneurs utilisant BoxLayout - même les conteneurs non-Box.

Si vous ne l'avez pas encore vu, le tutoriel Comment utiliser BoxLayout est très utile.

5
Paul