Pourquoi ne GridBagLayout centre de mes composants au lieu de le mettre dans le coin?
Jusqu'à présent j'ai réussi à éviter à l'aide de la GridBagLayout
(par la main de code) autant que possible, mais je ne pouvais pas l'éviter cette fois, et je suis à la lecture du SOLEIL tutoriel GridBagLayout
Jusqu'à présent, il ne va pas bien. Je pense que je suis missunderstanding quelque chose.
Par exemple, j'ai essayer le code suivant (semblable à celui du SOLEIL post):
public class MainFrame extends JFrame {
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MainFrame frame = new MainFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame
*/
public MainFrame() {
super();
setBounds(100, 100, 500, 375);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container mainContainer = getContentPane();
mainContainer.setLayout(new GridBagLayout());
//add label
JLabel someLabel = new JLabel("Label 1:");
GridBagConstraints constraints = new GridBagConstraints();
constraints.gridx = 0;
constraints.gridy = 0;
//constraints.anchor = GridBagConstraints.FIRST_LINE_START;
//constraints.weightx = 0.5;
mainContainer.add(someLabel, constraints);
JTextField someText = new JTextField(30);
constraints = new GridBagConstraints();
constraints.gridx = 1;
constraints.gridy = 0;
constraints.weightx = 0.5;
mainContainer.add(someText, constraints);
//
}
}
Je obtenir le label et le champ de l'une à côté de l'autre dans le centre de l'image.
Mais je m'attendais à ce qu'ils apparaissent dans le coin supérieur gauche depuis le gridx et gridy est de 0 pour le label.
Même si j'ai mis constraints.anchor = GridBagConstraints.FIRST_LINE_START;
toujours le même résultat.
Je suis mal ici?
Du SOLEIL de l'après:
Spécifier la ligne et de colonne dans le coin supérieur gauche du composant. L'
colonne la plus à gauche a l'adresse gridx=0 et le haut de la ligne a l'adresse
gridy=0.
OriginalL'auteur Cratylus | 2011-09-01
Vous devez vous connecter pour publier un commentaire.
Ajouter
constraints.weighty = 1;
à la JLabel contraintes etconstraints.anchor = GridBagConstraints.NORTHWEST;
le Champ de contraintes.EDIT:
À partir d'Oracle GridBagLayout guide:
constraints.weighty=1
de l'étiquette ainsi et de point d'ancrage à l'étiquetteFIRST_LINE_START
.Mais ce qui fait la valeur 1 en poids signifie réellement?Aussi, dans leur code de l'exemple, cette ligne de code, avec commentaire, se lève:
c.weighty = 1.0; //request any extra vertical space
Pour JButton5, je le vois.Mais je ne pense pas que ce soit une bonne présentation.De toute façon pourquoi 1 et non plus de 0,8 par exemple. Je ne comprends pas comment ces numéros sont sélectionnés
En toute honnêteté, je n'ai pas non plus. J'utilise MiGLayout pour tout...miglayout.com
OriginalL'auteur BenCole
Vous avez besoin de lire plus loin dans le Swing tutoriel pour la section sur
weightX/weightY
, où il est dit:, Sauf si vous spécifiez au moins une valeur non nulle pour weightx ou lourde, tous les composants de regrouper dans le centre de leur conteneur.
Vous avez spécifié un weightX mais ne pas une grande.
Modifier, c'est plus compliqué que je ne le pensais. Il apparaît, vous devez également indiquer:
pour les deux composants dans addiation pour le poids.
weightx si pour le positionnement horizontal. lourdes est pour le positionnement vertical. J'ai utilisé 1.0 pour les deux ainsi que FIRST_LINE_START pour les deux et il a travaillé pour moi.
Oui maintenant ça fonctionne.Mais ce qui fait la valeur 1 en poids signifie réellement?Je n'ai pas l'obtenir.Aussi il me semble (par le besoin d'ancrage) qu'en quelque sorte, la grille est déjà là et pas construite en plaçant les éléments sur elle.Droit?
GridBagLayout affiche les composants à leur taille. Quand il n'y a plus d'espace le weightX/les valeurs de Y sont un indice pour le layout manager comment allouer cet espace. EON de l'astuce a fonctionné parce qu'il ajoute une deuxième ligne de composants et a demandé pour la ligne à prendre tout l'espace supplémentaire à l'aide d'un poids = 1.0. Dans votre cas, vous n'avez qu'une seule ligne, donc, vous avez besoin de spécifier que l'un des composants a l'ensemble de l'espace supplémentaire.
Ok, mais j'ai utilisé de poids seulement à l'étiquette.Si l'étiquette reçoit le supplément de l'espace vertical (qui n'est pas visible pour l'utilisateur, je suppose).Mais pourquoi est-ce aussi affecter le textfield et va aussi?
OriginalL'auteur camickr
Je ne peut pas répondre directement à votre question, mais croyez-moi, vous devriez faire vos essais et des erreurs sur les mises en page avec un IDE. Personnellement, je suggère Netbeans. De là, vous pouvez faire glisser et déplacer, puis de prendre un coup d'oeil sur les propriétés. Au premier abord, on aurait une certaine valeur par défaut dans l'inspecteur des propriétés, donc moins de génération automatique de code pour cela. Mais ensuite, une fois que vous commencez à jouer avec les mises en page, vous pouvez voir le code et obtenir une belle compréhension de savoir ce que vous faites et comment vous le faites.
OriginalL'auteur bragboy
Vous pouvez atteindre cet objectif en utilisant une astuce, ajouter un mannequin composant, une fois votre ligne et de le développer pour remplir l'espace vertical. Aussi, vous pouvez ré-utiliser les contraintes, pas besoin de créer un nouvel objet:
EDIT: ok oublier le truc 🙁 La voie droite, c'est comme Deon Botha et BenCole dit, j'ai mis à jour mon code à l'aide de l'ancre
Veuillez NE PAS accepter cette réponse, accepter Deon ou Ben
Vous avez raison, il doit travailler " mais le GridBayLayout est le mal pur, et bien en fait c'est très bon ... difficile, je ne suis pas un puriste, si elle fonctionne avec une fausse étiquette, alors pourquoi ne pas l'utiliser?
Vous pouvez également définir
constraints.weighty = 1.0; constraints.anchor = GridBagConstraints.FIRST_LINE_START;
OriginalL'auteur eon
Cela a fonctionné pour moi:
OriginalL'auteur Ray Hulha