是否有一种独立于外观的方式将组件(例如JLabel
)水平对齐JCheckBox
的文本?
我正在尝试使用UIDefaults
中的值来预测文本相对于JCheckBox
左上角的位置。我找到了一个组合,可以为Metal,Windows,Motif和Aqua Look-and-Feels提供合适的结果:
但不是在Nimbus:
是否有某种实用方法能够可靠地为所有外观中的文本提供X,Y偏移量?
代码(注意:为避免任何布局副作用,我在此测试中使用了null布局):
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;
}
答案 0 :(得分:3)
(对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_;
}
答案 1 :(得分:2)
您可以右对齐标签并将其宽度设置为复选框的宽度减去右边框。它适用于Windows JDK1.6.0_21的所有LAF,包括Nimbus。我没有Mac,所以无法测试Aqua。
以下是您的代码略有修改:
class AlignCheckBoxText extends JApplet {
public AlignCheckBoxText() {
setLayout(null);
checkBox = new JCheckBox("Hello, World!");
label = new JLabel("Hello, World!");
add(checkBox);
add(label);
label.setHorizontalAlignment(JLabel.TRAILING);
}
@Override
protected void validateTree() {
checkBox.setLocation(0, 0);
checkBox.setSize(checkBox.getPreferredSize());
int x = 0;
Border cbBorder = UIManager.getBorder("CheckBox.border");
if (cbBorder != null) {
Insets borderInsets = cbBorder.getBorderInsets(checkBox);
if (borderInsets != null) {
x += borderInsets.right;
}
}
label.setLocation(0, checkBox.getHeight());
label.setSize(new Dimension(checkBox.getPreferredSize().width - x, label.getPreferredSize().height));
super.validateTree();
}
private JCheckBox checkBox;
private JLabel label;
}
答案 2 :(得分:1)
这不是一个完整的回复,但它可能对您有所帮助:
如果你将checkBox.getIconTextGap()
添加到labelX的值,使用Nimbus的对齐似乎没问题,但是对于金属或GTK,则不正常。
答案 3 :(得分:1)
如果使用GroupLayout,Netbeans GUI构建器可以将复选框的文本与下一行的标签对齐....排序。
它似乎适用于Nimbus,但在另一个LAF中,标签文字是一个距离太远的像素。在GUI构建器中查看GroupLayout的生成代码,它会在标签前面产生22x22的差距。对于Nimbus来说,22似乎是正确的,但对于其他LAF,它似乎是21。
生成的代码如下所示。
GroupLayout layout = new GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHortizontalGroup(
layout.createParallelGroup(Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(22,22,22)
.addComponent(label)
)
.addComponent(checkBox)
)
)
);
layout.setVerticalGroup(
layout.createParallelGroup(Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(checkBox)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(label)
)
);
在label和checkBox的赋值之后,此代码将放在示例类的构造函数中。另外,删除setLayout(null);
所有这些都是基于我使用GUI构建器看到的内容,我推荐以下内容:
Border cbBorder
位checkBox.getIconTextGap()
添加到labelX。