Выровнять JLabel с текстом JCheckBox

Есть ли независимый от внешнего вида способ выравнивания компонента (например, a JLabel ) по горизонтали с текстом в JCheckBox ?

Я пытаюсь использовать значения из UIDefaults для прогнозирования расположение текста относительно левого верхнего угла JCheckBox . Я нашел комбинацию, которая дает правильный результат для Metal, Windows, Motif и Aqua Look-and-Feels:
Example: Metal (correctly-aligned)

Но не в Nimbus:
Example: Nimbus (incorrectly-aligned)

Есть ли где-нибудь служебный метод, который надежно даст смещения X, Y для текста во всех стилях и ощущениях?


Код (примечание: чтобы избежать побочных эффектов макета, я использовал пустой макет для этого теста):

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;

}
8
задан finnw 18 September 2010 в 14:01
поделиться