comment définir la taille des composants à l'intérieur du contenant avec BoxLayout
Confrontés avec le problème de l'utilisation BoxLayout
Dans mon exemple, j'essaie de diminuer la hauteur de la zone de texte et modifiez la largeur des boutons (comme indiqué dans le marqueur vert sur l'image). Je connais les techniques de setPrefferedSize () et setMaximumSize (), mais il ne fonctionne pas comme il le devrait. La ligne add(Box.createHorizontalGlue ()) aussi n'a pas aidé.
Merci pour toute idée
public class Testy extends JPanel {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
constructGUI();
}
});
}
private static void constructGUI() {
JFrame frame = new JFrame("Testy");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JPanel centerPanel = new JPanel();
centerPanel.setBackground(Color.DARK_GRAY);
centerPanel.setPreferredSize(new Dimension(100, 400));
frame.add(centerPanel, BorderLayout.CENTER);
Testy eastPanel = new Testy();
frame.add(eastPanel, BorderLayout.EAST);
frame.pack();
frame.setVisible(true);
}
public Testy() {
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
JButton button = new JButton("Button ...... 1");
//button.setPreferredSize(...);
//button.setMaximumSize(...);
add(button);
button = new JButton("Button 2");
//button.setPreferredSize(...);
//button.setMaximumSize(...);
add(button);
button = new JButton("Button ........... 3");
//button.setPreferredSize(...);
//button.setMaximumSize(...);
add(button);
JLabel label = new JLabel("Label");
//label.setPreferredSize(...);
//label.setMaximumSize(...);
add(label);
JTextField textField = new JTextField();
//textField.setPreferredSize(...);
//textField.setMaximumSize(...);
add(textField);
button = new JButton("Button 4");
//button.setPreferredSize(...);
//button.setMaximumSize(...);
add(button);
//add(Box.createHorizontalGlue());
}
}
Comme un remède rapide, vous pouvez imbriquer les mises en page, dans le sens, que sur le côté droit, créer un
Pour mieux aider plus tôt, après une SSCCE. Un SSCCE devrait inclure des importations, d'une définition de classe & un
JPanel
avec BorderLayout
, mettre un JPanel(say centerPanel)
à la CENTER
et un JPanel(say buttonPanel)
à PAGE_END
emplacement. Utilisez maintenant une nouvelle JPanel(say compPanel)
avec GridLayout
et de mettre tous les composants, et placez ce compPanel
à l'intérieur de centerPanel
. Lieu JButton(button4)
à l'intérieur de buttonPanel
. Je suppose que cela va fonctionner 🙂Pour mieux aider plus tôt, après une SSCCE. Un SSCCE devrait inclure des importations, d'une définition de classe & un
main
méthode.OriginalL'auteur Dumas45 | 2013-08-23
Vous devez vous connecter pour publier un commentaire.
D'abord, vous devez comprendre que composante de la position et de la taille en Java Swing dépend de Layout manager (si le gestionnaire de configuration est réglé) et non pas sur le composant lui-même. Le composant demande au gestionnaire pour la taille.
Pour ce cas, je voudrais utiliser différents schémas de combinaison de GridLayout et BorderLayout est suffisant et très simple. Mais si vous voulez utiliser BoxLayout, alors...
Documentation dit:
Puis définissez les composants de taille maximale:
c.setMaximumSize(new Dimension(Integer.MAX_VALUE, c.getMinimumSize().height));
(c
signifiebutton
,label
ettextField
dans votre exemple)Edit 1:
Ici est de travailler le code source:
Edit 2:
Si vous voulez aménagé Bouton 4 au bas de la colonne de droite ajoutez cette ligne
add(Box.createVerticalGlue());
entreadd(textField);
etbutton = new JButton("Button 4");
.J'ai vraiment besoin d'une zone de mise en page, et ton exemple fonctionne comme il se doit. Merci pour la clarification
certainement besoin d'une zone de mise en page - pourquoi? BTW, -1 pour la setXXSize, ce qui est un non-non-plus
layout manager fonctionne avec XXSizes ou pas. Cela dépend de la disposition de la crèche de la mise en œuvre. Si vous utilisez BoxLayout, que vous devez utiliser le setXXSize (ou me montrer l'exemple sans). Si maxSize est défini, il sera utilisé pour BoxLayout. JButton jeux de maxSize à prefferedSize par défaut, puis j'ai changer pour MAX_VALUE si je veux étendre le bouton de surface disponible. Hauteur de bouton est fixée à une valeur constante (minSize.hauteur) parce que je ne veux pas l'étendre à l'espace disponible.
JButton jeux de maxSize à prefferedSize par défaut ce n'est pas vrai: retourne son pref que max (vs configure). La différence peut sembler petit, mais il a de lourdes conséquences: la première est dynamique, celle-ci est statique et dur-codes le pref hauteur. Ce sera le mauvais moment de la pref hauteur, f.j'. par la définition d'une police de caractères différente. La seule façon de tordre le xxSizes est à la sous-classe et de remplacer les getters. Ou: utiliser un meilleur LayoutManager qui permet le réglage fin sur son propre niveau 😉
OriginalL'auteur Boris Šuška
Comme un remède rapide, vous pouvez imbriquer les mises en page, dans le sens, que sur le côté droit, créer un
JPanel
avecBorderLayout
, mettre unJPanel(say compPanel)
à laCENTER
et unJPanel(say buttonPanel)
àPAGE_END
emplacement. Utilisez maintenant une nouvelleJPanel(say panel)
avecGridLayout
et de mettre tous les composants, et placez cecompPanel
à l'intérieur decenterPanel
. LieuJButton(button4)
à l'intérieur debuttonPanel
.BoxLayout
au contraire, respecte la taille préférée d'unJComponent
, qui est généralement calculée sur la base du contenu de laJComponent
détient ou donné explicitement, d'où les composants n'ont pas tendance à s'aligner avec d'autres composants.Voici l'exemple :
De SORTIE :
OriginalL'auteur nIcE cOw
Cela devrait se fermer, basé sur votre tirage, juste besoin de travailler sur ce composant
ci-dessous le JLabel (à l'aide de setPreferredSize()):
new GridLayout(0, 1)
, cela signifie que n'importe quel nombre de lignes, mais exactement de la colonne, il a un meilleur sens. De toute façon je ne sais pas ce qui se passe quand j'ajoute de plus de 6 composantes.OriginalL'auteur Fernando