Swing 如何创建具有零宽度边框的JComboBox?

Swing 如何创建具有零宽度边框的JComboBox?,swing,layout,Swing,Layout,我想显示一个“表”,其中JLabel在第1列右对齐,组件在第2列中每行左对齐。当第2列的组件是JLabel、JTextField和JCheckBox时,我能够使它看起来很好。但是我在JComboBox上遇到了麻烦,这是可以理解的 我认为有两种(可能有三种)方法可以解决这个问题 增加非JComboBox组件的左侧插图 将所有零部件的插入归零,并让布局管理器处理间隙 摆弄UIManager将JComboBox插件归零 在我尝试之前,#2选项似乎更容易理解、实现和维护。我从FormLayout开始,但

我想显示一个“表”,其中
JLabel
在第1列右对齐,组件在第2列中每行左对齐。当第2列的组件是
JLabel
JTextField
JCheckBox
时,我能够使它看起来很好。但是我在
JComboBox
上遇到了麻烦,这是可以理解的

我认为有两种(可能有三种)方法可以解决这个问题

  • 增加非JComboBox组件的左侧插图
  • 将所有零部件的插入归零,并让布局管理器处理间隙
  • 摆弄UIManager将JComboBox插件归零
  • 在我尝试之前,#2选项似乎更容易理解、实现和维护。我从
    FormLayout
    开始,但由于我在
    GridLayout
    中遇到了同样的“未对齐”问题,我选择发布GridLayout版本,以便于验证。请告诉我,我可以不费吹灰之力让选项2发挥作用,或者如何让选项3发挥作用

    以下是我的例子:

    下面是显示的内容,显示“r1”中的“r”与
    JComboBox的边框笔划的最左侧像素不对齐:


    在Sergiy的提示下,我在Windows 10和Fedora 20上测试了代码,也无法重现问题。这让我很兴奋。同样在他的提示下,我尝试将UI设置为
    BasicComboBoxUI
    ,而不是使用默认的
    com.apple.laf.aquaComboxUI
    ,并且对齐问题没有出现。不幸的是,该UI在另一方面没有吸引力。

    无法在Windows上重现您的问题。可能这只是Mac版的问题?您还可以尝试插入行
    r2.setUI(新的BasicComboxUI())。但我不确定这种变通方法是否能让你满意。
    
    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);
        }
    }