java - 将 JLabel 与 JCheckBox 的文本对齐

标签 java swing jcheckbox

是否有独立于外观和感觉的方式将组件(例如 JLabel)与 JCheckBox文本水平对齐>?

我正在尝试使用 UIDefaults 中的值来预测文本相对于 JCheckBox 左上角的位置。我找到了一个组合,可以为 Metal、Windows、Motif 和 A​​qua 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;

}

最佳答案

(致OP:请不要接受我之前的错误答案,我会删除它。对不起!)

您可以使用不为标签绘制复选框的复选框。这适用于 Windows JDK6 中的所有 LAF,包括 Nimbus。我没有 Mac,所以无法测试 Aqua。

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_;
}

关于java - 将 JLabel 与 JCheckBox 的文本对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3741972/

相关文章:

java - 如何导入 AcknowledgingConsumerAwareMessageListener

java - 操作更改背景按钮。我的操作无法与按钮 ActionListener 配合使用

Java 使用 JCheckboxes 对文件中的数据进行排序

java - 如何为框架设置彩色背景?

Java图形绘制

java - JCheckBox:多行文本的垂直对齐

java - JCheckbox 显示一个 displayName 但在幕后保存不同的值

java - 比较java中的时间

java - 我可以将 'UNICODE_CHARACTER_CLASS' 设置为所有模式用法吗?

java - 从远程服务器中的某个位置创建 `FileOutputStream`