Y a-t-il un moyen indépendant de l'apparence d'aligner un composant (par exemple un J'essaie d'utiliser des valeurs à partir du code> uidefault code> pour prédire l'emplacement du texte par rapport au coin supérieur gauche du mais pas au nimbus: existe une méthode utilitaire quelque part qui sera fiable Donnez x, Y compensations pour le texte dans tous les look-and-sent? p> Code (Remarque: Pour éviter tout effets secondaires de la présentation, j'ai utilisé une mise en page nulle pour ce test): P > jlabel code>) horizontalement avec le texte em> d'un
jcheckbox code >?
jcheckbox code>. J'ai trouvé une combinaison qui donne le bon résultat pour le métal, les fenêtres, le motif et l'aspect aqua-et-l'estime:
p>
P>
import java.awt.Insets;
import javax.swing.JApplet;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.UIManager;
import javax.swing.border.Border;
public class AlignCheckBoxText extends JApplet {
public AlignCheckBoxText() {
setLayout(null);
checkBox = new JCheckBox("Hello, World!");
label = new JLabel("Hello, World!");
add(checkBox);
add(label);
}
@Override
protected void validateTree() {
checkBox.setLocation(0, 0);
checkBox.setSize(checkBox.getPreferredSize());
int labelX = UIManager.getIcon("CheckBox.icon").getIconWidth();
Insets cbInsets = UIManager.getInsets("CheckBox.margin");
if (cbInsets != null) labelX += cbInsets.left + cbInsets.right;
Border cbBorder = UIManager.getBorder("CheckBox.border");
if (cbBorder != null) {
Insets borderInsets = cbBorder.getBorderInsets(checkBox);
if (borderInsets != null) {
labelX += borderInsets.left;
}
}
label.setLocation(labelX, checkBox.getHeight());
label.setSize(label.getPreferredSize());
super.validateTree();
}
private JCheckBox checkBox;
private JLabel label;
}
4 Réponses :
Ce n'est pas une réponse complète, mais cela pourrait vous aider: P>
Si vous ajoutez Cochez la case.geticontexgap () Code> à la valeur de Labelx, l'alignement semble être ok avec Nimbus, mais pas ok avec le métal ou le GTK. P>
Intéressant. Cochez la case.geticontextgap CODE> donne un résultat utile (éventuellement une coïncidence) au Nimbus mais un résultat non utile dans d'autres L & FS.
Uimanager.get ("Cochez la case.texticongap") code> retourne toujours zéro.
C'était la solution que j'allais suggérer également, bien que vous notiez que la LAF ne soit pas obligée d'utiliser l'une des valeurs par défaut UIMANAGER. De plus, je reçois une valeur non nulle pour la LAF par défaut. Découvrez le programme UIManager par défaut ( TIPS4JAVA.WordPress.com/2008/10/ 09 / Uimanager-par défaut est ). Tous les exemples que j'ai jamais vus dans le tutoriel de swing remplacent la méthode init () pour créer l'interface graphique. Peut-être que le problème est avec la méthode que vous remplacez et que la LAF n'est pas encore installée? Essayez la voie normale ou essayez de créer un jframe pour votre démo de voir s'il y a une différence.
Si vous utilisez grouplayout, le générateur GUI NetBeans peut aligner le texte d'une case à cocher et une étiquette sur la ligne suivante ... Sorte de.
Il semble fonctionner bien pour Nimbus, mais dans l'autre LAF Le texte de la marque est un pixel trop loin à droite. En regardant le code généré pour le grouplayout dans le constructeur de l'interface graphique, il constitue une lacune de 22x22 devant l'étiquette. Pour Nimbus, 22 semble juste, mais pour les autres Lafs, il semble être 21. p>
Le code généré ressemble à ceci. P> Ce code serait Allez dans le constructeur de la classe d'échantillonnage après les affectations de l'étiquette et de la case à cocher. En outre, retirez la SETLAYOUT (NULL); P> Tout cela dit, sur la base de ce que j'ai vu à l'aide du constructeur de l'interface graphique, je recommanderais ce qui suit pour réel: p>
.geticontextgap () code> au labelx. Li>
Vous pouvez aligner à droite l'étiquette et définir sa largeur pour être la largeur de la section Cochez la case moins la frontière droite. Cela fonctionne pour tous les lafs avec Windows JDK1.6.0_21, y compris Nimbus. Je n'ai pas de Mac alors ne peut pas tester Aqua.
Voici votre code très légèrement modifié: p>
J'aimerais pouvoir supprimer ou descendre voter ma réponse. C'est vraiment mort du cerveau (pas d'offense à OP, c'est tout ma faute). Cela ne fonctionne que lorsque la case à cocher et l'étiquette ont un texte identique. Vous pouvez le pirater en réglant le texte de la case à cocher réel après la définition de la taille de l'étiquette, mais vous devez ensuite le faire lorsque l'étiquette change de texte. Aussi, il échoue pour les paramètres régionaux de droite à gauche. Une vraie réponse aurait probablement besoin de plonger dans la case à cocher UI, que je ne connais pas. Désolé.
Même si cette réponse a des inconvénients, je pense que cela devrait rester. Ne le supprimez pas. Bien que peut-être que l'OP puisse l'accepter.
(à OP: S'il vous plaît, n'acceptez pas ma mauvaise réponse antérieure, et je le supprimerai. Désolé!)
Vous pouvez utiliser une case à cocher qui ne peigne pas la case à cocher pour vos étiquettes. Cela fonctionne pour tous les LAFS dans Windows JDK6, y compris Nimbus. Je n'ai pas de Mac alors ne peut pas tester Aqua. P>
class CheckBoxLabel extends JCheckBox { public CheckBoxLabel(String string) { super(string); } public void updateUI() { setUI(new CheckBoxLabelUI()); } } class CheckBoxLabelUI extends BasicCheckBoxUI { public void installUI(JComponent c) { super.installUI(c); Icon i = super.getDefaultIcon(); icon_ = new EmptyIcon(i.getIconWidth(), i.getIconHeight()); } public Icon getDefaultIcon() { return icon_; } private Icon icon_; } class EmptyIcon implements Icon { public EmptyIcon() { this(0, 0); } public EmptyIcon(int width, int height) { width_ = width; height_ = height; } public int getIconHeight() { return height_; } public int getIconWidth() { return width_; } public void paintIcon(Component c, Graphics g, int x, int y) { } private int width_; private int height_; }
Dans ce cas, il serait plus simple de créer une case à cocher sans texte, et un jlabel distinct contenant le texte des cases à cocher d'origine.
@barjak, qui va gâcher avec l'affichage de la mise au point. Normalement, il y a une bordure autour de la case à cocher (icône et texte) pour montrer quand elle est concentrée. En cliquant sur le texte, cliquez également sur la sélection de la case à cocher.