如何创建宽度为零的JComboBox?

时间:2018-05-30 04:54:44

标签: swing layout

我想显示一个“表格”,其中{1}}在第1列中右对齐,而第2列中的每个行左对齐一个组件。当第2列组件为JLabelJLabelJTextField时,我已经能够让它看起来很好看。但我可以理解JCheckBox

我看到两种方法(可能是三种)来解决问题。

  1. 增加非JComboBox组件的左侧插入
  2. 将所有组件的插入归零并让布局管理器处理间隙
  3. 摆弄UIManager以将JComboBox插件归零?
  4. 在我尝试之前,#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); } } 的边框描边的最左边像素对齐:

    enter image description here

    在Sergiy的提示下,我在Windows 10和Fedora 20上测试了代码,但也无法重现问题。这让我wonder。同样在他的提示下,我尝试将UI设置为JComboBox,而不是使用默认的BasicComboBoxUI,并且未显示对齐问题。不幸的是,该UI以不同的方式没有吸引力。

0 个答案:

没有答案