Pourquoi BoxLayout me permet pas de modifier la largeur d'un JButton, mais permettez-moi de modifier la hauteur?
Que j'essaie de faire la Mise en page d'un JDialog
de la mine pour s'adapter à un particulier regarder un programme dans lequel je suis le portage en Java, j'ai utilisé plusieurs LayoutManagers avant, avec grand succès, mais pour une raison que je n'arrive pas à obtenir ce travail à tous. Mon but est d'avoir le Droit (côté Est) de la JDialog
contenir un "Suivant" et le bouton "Annuler" dans un ordre de haut en bas, puis tout espace supplémentaire au-dessous de sorte que les deux boutons sont toujours au top de la JDialog
, pourtant, pour une raison BoxLayout
est continuellement en ignorant les tentatives de changer (c'est là que je suis perdu) la largeur d'un JButton
. Le Code qui suit.
JButton findNext = new JButton("Find Next");
JButton cancel = new JButton("Cancel");
cancel.setPreferredSize(new Dimension((int)findNext.getPreferredSize().getWidth(),
(int)cancel.getPreferredSize().getHeight()));
JPanel example = new JPanel();
example.setLayout(new BoxLayout(example, BoxLayout.Y_AXIS));
example.add(findNext);
example.add(cancel);
example.add(Box.createGlue());
Peu importe ce que je tente, cancel
conserve toujours il est de taille normale. J'ai essayé setMinimumSize()
et setMaximumSize()
avec les mêmes paramètres que setPreferredSize
avec pas de chance. J'ai même essayé de cancel.setPreferredSize(new Dimension(500, 500));
et les boutons de la hauteur était la seule chose ajusté, il a TOUJOURS conservé la largeur par défaut a été donné.
Pour répondre à toute question, voici à quoi il ressemble (maintenant que je l'ai fini) et vous verrez que le "Suivant" et "Annuler", les boutons ne sont pas de la même taille.
- J'ai ajouté un lien à la question principale de la JDialog afin que vous puissiez mieux comprendre mon problème.
- Merci à vous, j'ai été la révision du code pour mettre la partie pertinente ici, désolé, j'ai raté la parenthèse.
- Pas de problème, j'ai juste copié sur Eclipse pour jouer avec elle un peu et a remarqué qu'il lui manquait, donc voulu fixer pour les autres. 🙂
- Donc, en utilisant
setMaximumSize()
ne fonctionne pas? Quelle version de Java vous exécutez le programme en vertu de l'? - Je suis à l'aide de Java 6 Update 21 avec NetBeans 6.9.1 ensemble afin de tester la compatibilité avec Java 5.
- Je ne peux pas dire ce que j'ai fait de mal, c'était peut-être un copier/coller problème lorsque j'ai copié le setPreferredSize() mais en ajoutant dans setMaximumSize() fait le travail. Je ne peux pas croire que c'était quelque chose que j'ai oublié, merci de le signaler que sinon je n'aurais pas pensé à essayer de nouveau!
- Content que ça fonctionne! Je suis allé de l'avant et a expliqué ce qu'il se passe sous le capot qui fait la différence entre les deux, par souci d'exhaustivité.
Vous devez vous connecter pour publier un commentaire.
Je sais que c'est une vieille question, mais je ne vois vraiment pas une bonne explication. Donc, pour le bien des chercheurs que de tomber sur ce je vais ajouter mon grain de sel.
Il y a trois méthodes de dimensionnement des composants Swing: setPreferredSize(), setMinimumSize(), et setMaximumSize(). Toutefois, le point important est que c'est à la configuration particulière du gestionnaire être utilisé quant à savoir si ou non il honore l'une de ces méthodes.
Pour BoxLayout (la mise en page de l'affiche originale est de l'utiliser):
BoxLayout
les honneurs de cetteBoxLayout
les honneurs de cetteL'OP est à l'aide d'un Y_AXIS BoxLayout c'est pourquoi seulement sa hauteur a été modifié.
Mise à jour: j'ai mis en place une page avec ces mêmes informations pour tous les gestionnaires de disposition. J'espère que ça peut aider certains chercheurs out: http://thebadprogrammer.com/swing-layout-manager-sizing/
Vous ne voulez pas
Box.createGlue()
, qui "pousse comme nécessaire à absorber tout l'espace supplémentaire dans son conteneur." Au lieu de cela, utiliserBoîte.createVerticalStrut()
entre les boutons, comme indiqué ci-dessous et dans lepanneau de configuration
de cette simulation.Addendum:
C'est le comportement attendu pour les composants ayant un objet identique maximum d'épaisseur verticale
BoxLayout
, comme décrit dans de la Boîte de Fonctions de Mise en page. Le préféré de la largeur du conteneur devient celle de la (large) des enfants, et le X de l'alignement devient hors de propos.setMaximumSize()
œuvres.Comme mentionné dans les commentaires sur la question, vous avez été en mesure de le réparer en passant à
setMaximumSize()
. Cependant, comme vous l'avez remarqué,setPreferredSize()
ne fonctionne pas. Alors, qu'est-ce qui?Avec beaucoup de choses Swing, les propriétés utilisées pour déterminer la taille des composants lors de l'utilisation de la
BoxLayout
sont un peu aléatoires (à mon avis). Lors de la détermination de la façon de rendre les composants Swing appelslayoutComponent()
sur le layout manager, qui est sur les chiffres où la position de tout.BoxLayout
's la mise en œuvre delayoutComponent()
implique un appel à une méthode qui créeSizeRequirements
objets pour la largeur et la hauteur de chacun des éléments que vous ajoutez à laJPanel
, basé sur leurgetMinimum/Preferred/MaximumSize()
méthodes.Plus tard, il appelle
SizeRequirements.calculateAlignedPositions()
pour déterminer la largeur de valeurs pour chaque composant, en raison de votre orientation estBoxLayout.Y_AXIS
(Les hauteurs sont calculées en utilisant une autre méthode). En prenant des extraits de la source, la mise en œuvre de cette méthode est comme suit:Noter que
totalDescent
est la largeur disponible, de sortedescent
est toujoursmaxDescent
, qui est basé surSizeRequirements.maximum
, qui a été prise à partir deJButton.getMaximumSize()
. La valeur despans[i]
est ensuite utilisé plus tard dans un appel àJButton.setBounds()
comme la largeur. Comme vous l'aurez remarque,getPreferredSize()
n'a jamais été en cause ici, ce qui est pourquoi il n'a pas d'impact dans ce cas.Habituellement, si vous souhaitez assurer un de la taille de la composante dans le Swing, vous devez appeler
setMinimumSize()
,setMaximumSize()
, etSetPrefferedSize()
avec la même valeur.Si vous mettez vos boutons dans un GridLayout panneau, ils auront la même largeur.