是否有一种外观和感觉独立的方法使组件(例如JLabel
)水平地对齐JCheckBox
的文本。
我试图使用来自UIDefaults
的值来预测文本相对于JCheckBox
左上角的位置。我已经找到了一种组合,为金属、Windows、Motif和Aqua的外观提供了正确的结果:
但在尼姆布斯没有:
是否有一种实用的方法可以可靠地为文本提供所有外观和感觉上的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;
}
发布于 2010-09-18 21:49:50
您可以对齐标签,并将其宽度设置为复选框的宽度减去右边框。它适用于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;
}
https://stackoverflow.com/questions/3741972
复制相似问题