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
上遇到了麻烦,这是可以理解的
我认为有两种(可能有三种)方法可以解决这个问题
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);
}
}