Comment pouvez-vous arrêter un JLabel changer sa taille lorsque ses modifications dans le texte?
Je suis de générer des JComponents dans le code et à l'aide de la GridBag mise en page pour les organiser. Mon réseau est constitué de 12 lignes et 3 colonnes, chaque ligne comprenant un JSlider, un JCheckBox et un JLabel. Voici le code que j'utilise pour générer l'INTERFACE utilisateur:
final int NUM_MOTORS = 12;
//This is the panel I'm adding the components to.
pnlMotorSliders.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
for (int i = 0; i < NUM_MOTORS; ++i) {
c.gridy = i;
//Create the slider
JSlider slider = new JSlider(SwingConstants.HORIZONTAL, 10, 4085, 10);
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 0;
c.weightx = 0.9;
pnlMotorSliders.add(slider, c);
//Create the checkbox
JCheckBox checkBox = new JCheckBox();
checkBox.setOpaque(true);
checkBox.setBackground(Color.blue);
c.fill = GridBagConstraints.NONE;
c.gridx = 1;
c.weightx = 0.1;
pnlMotorSliders.add(checkBox, c);
//Create the current label
JLabel label = new JLabel("0");
label.setBorder(BorderFactory.createLineBorder(Color.red));
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 2;
c.weightx = 0.2;
pnlMotorSliders.add(label, c);
}
Le problème, je vais avoir, c'est que lorsque j'ai mis le texte dans la JLabels, ils changent leur largeur et leur incidence sur le reste de la mise en page, même si la largeur du texte que je suis paramètre semble être beaucoup plus petite que la largeur de la JLabel. Les deux captures d'écran de démontrer ce que je veux dire (le rouge et le bleu des frontières ont été à des fins de débogage):
J'ai mis le texte sur le fond JLabel "-12". Même si le JLabel semble être beaucoup plus large que le texte, il a changé sa taille, affecter le reste de la mise en page.
Pourquoi est-ce qui se passe et que puis-je faire pour l'empêcher?
OriginalL'auteur Amr Bekhit | 2012-06-05
Vous devez vous connecter pour publier un commentaire.
Vous pouvez fixer la taille des étiquettes de réglage au minimum, préférée et la taille maximale:
Assurez-vous également de définir la GridBagConstraints#remplir à pas, même si je ne suis pas sûr si cela est encore nécessaire (je pense que c'est).
EDIT: btw, pour se débarrasser de ces vilaines lignes en pointillés autour de la Composante, vous pouvez simplement le mettre pour ne pas être focusable:
Oui, setPreferredSize est suffisant, si ce n'est que de l'espace disponible. Mais sinon, les autres Composants de l'emporter et de l'étiquette sera forcé à être plus petit (ou plus grand). Mais pour votre demande, je suppose que setPreferredSize est assez. La raison pour laquelle il a changé, c'est que lorsqu'il n'est pas défini, la taille recommandée de la étiquette est selon le texte à afficher. Btw:
label.setHorizontalAlignment(JLabel.RIGHT);
mlgh être utile aussi. 😉Si ce n'est pas focusable, comment ajustez-vous à partir du clavier?
Vous ne pouvez pas (sauf si vous créez un KeyListener que les changements de manière indirecte). Mais à mon avis, un JSlider devrait être modifié avec la souris et non le clavier de toute façon. 😉
non, quel que soit le problème, le peaufinage d'un composant de dimensionnement des conseils est pas solution ... au lieu de cela, utilisez un décent LayoutManager
OriginalL'auteur brimborium
L'ensemble-le-choix-de la taille de la solution ne fonctionne que si vous n'avez pas les composants à l'horizontale remplir leur sac dans le GridBagLayout.
Une autre solution est de supprimer le poids que vous avez mis sur les composants dans la colonne de votre GridBagLayout. Vous pouvez alors contrôler la largeur de la colonne manuellement. Un moyen facile de le faire (au moment de la conception) est de placer un JLabel dans la colonne à zéro de la hauteur et la largeur que vous désirez.
Pourquoi est-ce? Vous avez besoin de creuser dans la façon dont le GridBagLayout travaux:
Le GridBagLayout tailles ses colonnes en fonction de l'espace requis, et utilise ensuite le poids à attribuer la "gauche plus" d'espace, de sorte que les largeurs de colonne, puis les ajouter à la largeur totale du panneau. L'espace requis pour chaque colonne est calculée par trouver la plus large des composantes de cette colonne.
L'espace requis pour chaque élément est déterminé par lui demander de quelle largeur il préfère. Dans votre cas, un JLabel avec "0" est plus petit qu'un JLabel avec "-12" et si la colonne est en train de changer de taille.
La gauche de l'espace est allouée sur la base horizontale coefficients de pondération attribués aux composantes dans chaque colonne. Les poids sont totalisées et les pourcentages pour chaque colonne sont déterminés en fonction de cette colonne pour cent du total.
La taille de la colonne est déterminée en fonction de l'espace requis en PLUS de la gauche dans l'espace. Ainsi, si tous vos composants dans la colonne n'ont pas de poids, alors vous ne serez pas obtenir toute la gauche dans l'espace, et donc de ne pas obtenir des changements dynamiques.
Une troisième solution est de tout simplement ne pas utiliser le GridBagLayout.
OriginalL'auteur johnstosh
Explicitement définir la préféré taille de vos étiquettes à l'aide de
JLabel#setPreferredSize(Dimension)
.De cette façon, vous de verrouillage la taille du composant, et de dire au gestionnaire de configuration pas à le redimensionner.
label.setSize(new Dimension(50, label.getPreferredSize().height));
et définir la GridBag Remplir à AUCUN. Malheureusement, l'étiquette ignore ma dimension, il utilise par défaut de la taille et de ses changements de largeur lorsque la modification du texte. J'ai essayé de réglage de la taille de l'étiquette à la fois avant et après que je l'ai ajouté au conteneur parent.J'ai édité l'original de la réplique. Fait un peu de codage, et il semble que tout simplement la mise en
preferredSize
est assez (peu importe ce que lesfill
valeur est). Vérifier si cela fonctionne pour vous, je vais poster un peu de code si vous en avez besoin.non, quel que soit le problème, le peaufinage d'un composant de dimensionnement des conseils est pas solution ... au lieu de cela, utilisez un décent LayoutManager
OriginalL'auteur npe
C'était la seule façon que j'ai pu trouver pour le faire fonctionner. La fixation d'un
Minimum
et/ou unMaximum
n'ai rien fait pour moi. Aussi, pour moi, sur l'île de java 8 j'avais besoin d'utiliser unDimension
, ou il n'y a pas eu de changement à la précédente, inapproprié tailles.OriginalL'auteur ryan_m