Comment puis-je obtenir un Composite avec un vide JLabel à prendre de la place dans un GridBagLayout
Je suis en train de travailler sur une interface graphique pour un projet à l'école. Je suis à l'aide d'un GridBagLayout en swing.
Je veux avoir une étiquette indiquant l'entrée(un type de fichier @ x = 0, y = 0), suivi par un autre label(le nom de fichier réel une fois sélectionné @ x = 1, y = 0
), suivi par un bouton parcourir pour un sélecteur de fichier( @ x = 2, y = 0
). L'étiquette à (1,0)
est initialement vide, cependant je veux que la zone que le texte s'occuper de prendre de l'espace lorsque l'étiquette ne contient pas de texte. Je veux aussi que l'espace entre les étiquettes à (0,0)
et le bouton à (2,0)
rester constante.
Pour atteindre cet objectif, j'essaie de mettre l'étiquette sur un panneau et puis jouer avec les mises en page. Cependant je ne peux pas couture pour atteindre les résultats souhaités. Quelqu'un pourrait-il offrir quelques suggestions? Les trois lignes de la GridBagLayout seront disposés exactement de la même manière.
Voici un lien vers une capture d'écran de l'interface graphique.
calibrationFileSelectionValueLabel = new JLabel("",Label.LEFT);
calibrationFileSelectionValueLabel.setName("calibrationFileSelection");
calibrationFileSelectionValueLabel.setMinimumSize(new Dimension(100,0));
calibrationFileSelectionValuePanel = new JPanel();
calibrationFileSelectionValuePanel.setBorder(BorderFactory.createEtchedBorder());
calibrationFileSelectionValuePanel.add(calibrationFileSelectionValueLabel);
c.gridx = 0;
c.gridy = 0;
c.fill = GridBagConstraints.NONE;
filesPanel.add(calibrationFileLabel,c);
c.gridy = 1;
filesPanel.add(frequencyFileLabel,c);
c.gridy = 2;
filesPanel.add(sampleFileLabel,c);
c.gridy = 3;
filesPanel.add(outputFileLabel,c);
c.gridx = 1;
c.gridy = 0;
c.fill = GridBagConstraints.BOTH;
//filesPanel.add(calibrationFileSelection,c);
filesPanel.add(calibrationFileSelectionValuePanel,c);
c.gridy = 1;
//filesPanel.add(frequencyFileSelection,c);
filesPanel.add(frequencyFileSelectionValueLabel,c);
c.gridy = 2;
//filesPanel.add(sampleFileSelection,c);
filesPanel.add(sampleFileSelectionValueLabel,c);
c.gridy = 3;
//filesPanel.add(outputFileSelection,c);
filesPanel.add(outputFileSelectionValueLabel,c);
c.gridx = 2;
c.gridy = 0;
c.fill = GridBagConstraints.NONE;
filesPanel.add(calibrationFileSelectionButton,c);
c.gridy = 1;
filesPanel.add(frequencyFileSelectionButton,c);
c.gridy = 2;
filesPanel.add(sampleFileSelectionButton,c);
c.gridy = 3;
filesPanel.add(createOutputFileButton,c);
panelForFilesPanelBorder = new JPanel();
panelForFilesPanelBorder.setBorder(BorderFactory.createCompoundBorder(new EmptyBorder(5,10,5,10), BorderFactory.createEtchedBorder()));
panelForFilesPanelBorder.add(filesPanel);
buttonsPanel = new JPanel();
buttonsPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
buttonsPanel.setBorder(BorderFactory.createCompoundBorder(new EmptyBorder(5,10,10,10), BorderFactory.createEtchedBorder()));
buttonsPanel.add(startButton);
buttonsPanel.add(stopButton);
basePanel.add(panelForFilesPanelBorder);
basePanel.add(numericInputPanel);
basePanel.add(buttonsPanel);
Vous pouvez définir le JLabel la taille minimale en appelant
setMinimumSize(Dimension d)
qui devrait faire ce que vous voulez.hmmm. Et bien j'ai essayé d'ajouter une image. J'ai besoin de 10 rep voix apparemment.
Ajouter un lien à une image et on peut l'ajouter à votre question pour vous. Qu'en est ma suggestion?
Dans ce cas, avec
GridBagLayout
réglage de la taille minimale seulement, ne fonctionnera pas. Vérifier ma réponse pour plus de détails et de m'indiquer si tout ce que j'ai expliqué, c'est mal 🙂
OriginalL'auteur restin84 | 2013-11-02
Vous devez vous connecter pour publier un commentaire.
Eh bien, Essentiellement, le GridBagLayout lieux de composants dans les rectangles (cellules) dans une grille, puis utilise les composants
preferred sizes
pour déterminer comment grand que les cellules doivent être. Avec cette mise en page:""
) texte UnJLabel\JTextFeild\JButton
's taille préférée est autour de(2,2)
, si aucune taille préférée conseils est donné explicitement à l'aide desetPreferredSize(size)
ou remplacement degetPreferredSize(size)
.À son point de réglage de la taille minimale ne fonctionnera pas, comme la taille préférée avec texte vide est d'environ
(2,2)
et du conteneur de taille est déjà plus grande que la taille préférée.GridBagLayout
utilise la taille préférée sans se soucier de la taille minimale à tous.Vous avez réellement besoin pour définir à la fois privilégié et taille minimale avec
GridBagLayout
parce que:Si vous essayez de régler une seulement la taille préférée, la réduction de la taille de la fenêtre finirait par provoquer le récipient de panneau de taille pour obtenir rétrécir. Le conteneur de la taille de l'écran sera petits que la taille de la pièce et de la
JLabel\JTextFeild\JButton
de réduire au minimum de leur taille. Si vous n'avez pas donné la taille minimum d'indices sur ce point, la valeur par défaut de la taille minimum: susceptible d'être autour de(2,2)
s'habitue. Vous comprendrez mieux avec le travail de l'exemple ci-dessous.Quelques autres choses à noter:
vous ajoutez le
panel
qui contient votrecalibrationFileSelectionValueLabel
. Vous n'avez pas besoin d'utiliser un panneau supplémentaire, plutôt qu'ajouter lecalibrationFileSelectionValueLabel
directement à la grille par le décor( au lieu primordialgetPreferedSize(Size)
est préférable)preferredSize
. Cependant, essayez de régler en médaillon à l'GridBagConstraints
de regarder votre premierpanel
un peu plus agréable:Un minimum de travail exemple pour vous:
Dans le cas où vous êtes de ne pas obtenir ce que nous disons, par exemple, j'ai mis seulement la taille préférée pour résoudre votre problème. Mais comme je n'ai pas défini la taille minimum, essayez de redimensionner la fenêtre pour correspondre avec l'explication ci-dessus.
Code Source:
C'est ok, je ne vais pas, en tant que votre réponse ajoute plus de précisions à mon explication 🙂
Les encarts. Vous pouvez créer toutes sortes d'espace blanc avec des inserts.
OriginalL'auteur Sage
Fâcheusement, une étiquette avec aucun texte n'aura pas d'espace vertical. Vous pouvez contourner ce problème en utilisant
" "
quand elle est vide.OriginalL'auteur John Kugelman
J'ai modifié le Sage du programme à l'aide de Jean
" "
truc et ajouté un peu de ma propreGridBagConstraint
assaisonnement pour faire de la boîte de dialogue redimensionner plus naturellement, en vertu de l'effondrement et de la développer.OriginalL'auteur Mike Clark
Comme l'a dit John, mettre un espace unique dans l'étiquette et/ou de l'ensemble de
setMinimumSize()
.Taille minimale est utile si le label est destiné à être rempli plus tard, sur l'INTERFACE utilisateur de l'activité.. empêche l'INTERFACE utilisateur de compactage dans une vilaine état lorsque rien n'est sélectionné initialement.
OriginalL'auteur Thomas W