我想显示一个“表格”,其中{1}}在第1列中右对齐,而第2列中的每个行左对齐一个组件。当第2列组件为JLabel
,JLabel
和JTextField
时,我已经能够让它看起来很好看。但我可以理解JCheckBox
。
我看到两种方法(可能是三种)来解决问题。
在我尝试之前,#2选项似乎更容易理解,实现和维护。我从JComboBox
开始,但由于FormLayout
遇到了相同的“错位”问题,我选择发布GridLayout版本以便于验证。请告诉我,我可以在没有太多麻烦的情况下使用#2选项,或者如何使#3选项工作。
以下是我的MCV示例:
GridLayout
这是显示的内容,显示'r1'中的'r'未与import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.plaf.basic.*;
public class TestFrame3 extends JFrame {
public TestFrame3 () {
JLabel l1 = new JLabel("l1"); l1.setBorder(new EmptyBorder(0, 0, 0, 0));
JLabel r1 = new JLabel("r1"); r1.setBorder(new EmptyBorder(0, 0, 0, 0));
JLabel l2 = new JLabel("l2"); l2.setBorder(new EmptyBorder(0, 0, 0, 0));
JComboBox r2 = new JComboBox(); r2.setBorder(new EmptyBorder(0, 0, 0, 0));
r2.setRenderer(new BasicComboBoxRenderer() {
@Override
public Component getListCellRendererComponent (JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
JComponent comp = (JComponent) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
comp.setBorder(new EmptyBorder(0, 0, 0, 0));
return comp;
}
});
JPanel p = new JPanel();
p.setLayout(new GridLayout(2, 2));
p.add(l1);
p.add(r1);
p.add(l2);
p.add(r2);
getContentPane().add(p);
setSize(new Dimension(100, 200));
}
public static void main (String args[]) {
new TestFrame3().setVisible(true);
}
}
的边框描边的最左边像素对齐:
在Sergiy的提示下,我在Windows 10和Fedora 20上测试了代码,但也无法重现问题。这让我wonder。同样在他的提示下,我尝试将UI设置为JComboBox
,而不是使用默认的BasicComboBoxUI
,并且未显示对齐问题。不幸的是,该UI以不同的方式没有吸引力。