Des largeurs fixes dans un GridBagLayout
Je suis en utilisant le GridBagLayout pour faire une Barre d'état qui ressemble à l'image. J'ai 4 zones, donc, j'ai un bouton dans la première, puis de messages d'information dans le second, et puis je veux deux de plus (et j'ai aussi un cinquième de faire le coin).
La zone du bouton s'adapte parfaitement, parce que le contenu est toujours un bouton avec la même largeur. De même avec le coin de la zone. La zone d'informations doit obtenir tout l'espace disponible. 3ème et 4ème régions doivent avoir une valeur fixe, indépendant de la taille de l'écran.
Comment puis-je le faire?
Mon code actuel est:
public MyStatusBar() {
setLayout(new GridBagLayout());
setPreferredSize(new Dimension(getWidth(), 23));
GridBagConstraints c = new GridBagConstraints();
botonDispositivo = new JButton("");
this.setText(0, "Disconnected");
URL imageUrl = getClass().getResource("resources/22x22/dispositivo01.png");
this.setButtonImg(imageUrl);
this.setButtonEnabled(false);
c.gridx = 0;
c.gridy = 0;
c.fill = GridBagConstraints.BOTH;
c.anchor = GridBagConstraints.WEST;
c.gridwidth = 1;
c.gridheight = 1;
this.add(botonDispositivo, c);
c.insets= new Insets(0,10,0,0);
c.gridx ++;
c.gridy = 0;
c.weightx = 0.7;
c.fill = GridBagConstraints.HORIZONTAL;
msgLabel = new JLabel("");
msgLabel.setPreferredSize(new Dimension(500, msgLabel.getHeight()));
this.add(msgLabel, c);
this.setText(1, "Waiting for potentiostat conection");
c.gridx ++;
c.gridy = 0;
c.weightx = 0.0;
c.fill = GridBagConstraints.NONE;
this.add(new SeparatorPanel(Color.GRAY, Color.WHITE), c);
c.gridx ++;
c.gridy = 0;
c.fill = GridBagConstraints.NONE;
c.weightx = 0.0;
overErrorLabel = new JLabel("");
overErrorLabel.setSize(new Dimension(150, overErrorLabel.getHeight()));
this.add(overErrorLabel, c);
//this.setText(2, "");
c.gridx ++;
c.gridy = 0;
c.weightx = 0.0;
c.fill = GridBagConstraints.NONE;
this.add(new SeparatorPanel(Color.GRAY, Color.WHITE), c);
c.gridx ++;
c.gridy = 0;
c.weightx = 0.0;
c.fill = GridBagConstraints.NONE;
c.anchor = GridBagConstraints.EAST;
timeLabel = new JLabel("");
timeLabel.setMinimumSize(new Dimension(150, timeLabel.getHeight()));
//timeLabel.setMaximumSize(new Dimension(150, timeLabel.getHeight()));
this.add(timeLabel, c);
//this.setText(3, "");
JPanel rightPanel = new JPanel(new GridBagLayout());
c.gridx ++;
c.gridy = 0;
c.weightx = 0.0;
c.fill = GridBagConstraints.BOTH;
rightPanel.add(new JLabel(new AngledLinesWindowsCornerIcon()), c);
rightPanel.setOpaque(false);
c.gridx ++;
c.gridy = 0;
c.fill = GridBagConstraints.BOTH;
this.add(rightPanel, c);
setBackground(SystemColor.control);
}
OriginalL'auteur Roman Rdgz | 2011-07-27
Vous devez vous connecter pour publier un commentaire.
pour le meilleur et le plus simple de sortie de l'interface utilisateur graphique est mieux de regarder pour
Borderlayout
,JPanel#setPrefferedSize(200, 30);
pourJButton
avecIcon
et JLabel mettre à laWEST area
JPanel#setPrefferedSize(200, 30);
(rightPanel) à laEAST area
mettre un autre
JPanel
àCENTER area
OriginalL'auteur mKorbel
Vous jeu préféré, minimum, maximul etc. la taille de différentes étiquettes.
Je pense que tous vous avez besoin est le poids de l'ensemble X>0 et remplir param=HORIZONTALE de la contrainte pour l'étiquette que vous voulez être redimensionnée et weightX=0 et remplissez-AUCUN pour les étiquettes que vous ne voulez pas être redimensionnée.
Également utiliser ipadx pour spécifier la taille minimale pour les étiquettes.
lorsque les étiquettes sont vides, les ipadx est la largeur de la zone. Mais quand j'écris sur l'étiquette et il devient par exemple 100px de large, la zone s'100px+ipadx de large. Je veux rester ipadx large toujours, comment doit-je faire?
De javadoc:ipadx Ce champ spécifie le rembourrage interne du composant, de combien d'espace pour ajouter à la largeur minimale de la composante. La largeur de l'élément est au moins le minimum de largeur de plus ipadx pixels. DONC, cela dépend de min taille de votre contenu.
Ouais, je sais déjà pourquoi c'est se comporter comme ça, ce que je veux qu'il ait une largeur fixe indépendamment de la largeur d'étiquette (qui sera toujours plus petit). Lors de l'étiquette largeur=0 la solution est OK, mais quand quelque chose est écrit, le problème décrit apparaît. Est-il possible de changer la ipadx valeur "constant_value-étiquette.getWidth()" à la volée?
Il est peut-être préférable de spécifier min/max/pref taille de l'étiquette et de ne pas utiliser l'étiquette? Ou tout simplement remplacer le getMinimumSize() de l'étiquette de retour toujours 0
OriginalL'auteur StanislavL
Si vous voulez une cellule à l'intérieur d'un GridBagLayout pour être fixé à la largeur (ou la hauteur), alors il existe une solution pour ce. Dites que vous voulez cellule (x,y) pour être fixé dans la largeur mais la JLabel à l'intérieur, il a contenu variable, qui doit être changée au cours de l'exécution. À l'aide d'un GridBagLayout serait ensuite déménager d'autres composants si le JLabel besoin de changer de taille, forçant ainsi le contenant de la cellule pour être redimensionnée. Pour contrer cela, vous pouvez effectuer l'une des opérations suivantes:
.setPreferredSize(new Dimension(desiredWidth, 0));
.gbc.insets = new Insets(0,preferredWidth,0,0);
ougbc.insets = new Insets(0,0,0,preferredWidth);
. De cette façon, le panneau lui-même est (0,0) dans la dimension mais le contenant de la cellule sera forcé d'être aussi large que vous spécifiez (parce que les façades latérales externes rembourrage, et au vu de la composante).Le premier vous demande d'appeler setPreferredSize() et cela me met toujours mal à l'aise, parce que vous êtes de jouer avec la tâche de la LayoutManager. Donc je préfère la deuxième solution, mais vous ne serez pas en mesure de visualiser votre cellule en tant que votre mannequin panneau n'a pas de taille. Dans la première solution, vous pouvez rendre votre téléphone visible en donnant le panneau d'une couleur d'arrière-plan.
Les avantages de cette approche est que vous n'avez pas à vous soucier de réglage tailles sur votre JLabel, en particulier sa hauteur qui est inconnu avant qu'il s'affiche. Vous ne pouvez pas définir de preferredSize sur le JLabel parce que vous ne savez pas quelle hauteur il doit avoir (dépendants de la plateforme, dépendant de la police, etc.). Vous venez d'ajouter, et à l'aide de la ligne fictive avec le mannequin le panneau en vigueur de la cellule contenant la JLabel être aussi larges que
desiredWidth
.Cette solution fonctionne étant donné que le JLabel la largeur ne dépassera pas
desiredWidth
car dans ce cas, la cellule va également croître. Vous pouvez toujours mettre un maximumSize sur le JLabel pour résoudre ce (ici, vous n'avez pas le problème de l'inconnu hauteur - la hauteur maximale que vous pouvez utiliser Entier.MAX_VALUE).La même histoire se passe à la hauteur, juste introduire un mannequin colonne et ajouter un mannequin Composite, avec la dimension = (0, preferredHeight) dans la cellule à la ligne où le problème se produit.
Inconvénient de cette méthode: vous devez utiliser mannequin composants qui n'est jamais la meilleure façon d'aller, mais il fonctionne très bien ici.
OriginalL'auteur Timmos