是否有独立于外观和感觉的方式将组件(例如 JLabel
)与 JCheckBox
的文本水平对齐>?
我正在尝试使用 UIDefaults
中的值来预测文本相对于 JCheckBox
左上角的位置。我找到了一个组合,可以为 Metal、Windows、Motif 和 Aqua Look-and-Feels 提供正确的结果:
但不在 Nimbus 中:
是否有实用方法可以可靠地为所有外观中的文本提供 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/