关于java:将JPanel围绕JCheckBox包裹而没有任何空间-Swing

Wrapping JPanel around JCheckBox without any space - Swing

我想在JPanel中显示JCheckBox-es的垂直列表。但是我决定用JPanel包装每个JCheckBox(以为我将来会需要它)。我将使用BoxLayout将这些JPanels(每个包含一个JCheckBox)垂直堆叠在另一个JPanel中。

BoxLayout可以按预期工作,而在JPanel之间没有添加任何垂直空间。我的问题是这些内部JPanels包含单独的复选框。每个面板的复选框周围都有相当大的空间。我想紧紧地包装这些复选框,以使jcheckbox的大小与包含它们的相应jpanel的大小相等。

对于这些单独的jpanel,我尝试了布局-flowlayout和默认布局。两者都没有帮助。

我怎样才能解决这个问题?我只是简单地设置flowlayout并将jcheckbox直接添加到jpanel。我没有使用其他代码。

我要添加示例代码:
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.FlowLayout;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import javax.swing.BoxLayout;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class TryBox  implements Runnable{

/**
 * @param args
 */

public static void main(String args[])
{
   SwingUtilities.invokeLater(new TryBox());
}
public void run()
{
    class InnerPanel extends JPanel
    {

        public InnerPanel(int i) {
            // TODO Auto-generated constructor stub
            setLayout(new FlowLayout());    

            setBackground(new Color(i*50, i*50, i*50));

            add(new JCheckBox("CheckBox"+i));

        }

    }
    JPanel outerPanel = new JPanel();
    outerPanel.setLayout(new BoxLayout(outerPanel, BoxLayout.Y_AXIS));

    for(int i=0;i<5;i++)
    {
        outerPanel.add(new InnerPanel(i));
    }
     JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JScrollPane sp = new JScrollPane(outerPanel);
        frame.setPreferredSize(new Dimension(200, 600));
        frame.getContentPane().add(new JScrollPane(outerPanel));
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
}

}

在这里,frame.setPreferredSize(new Dimension(200, 600));有所作为。我希望jpanels减少到jcheckboxes的大小。我不希望jcheckboxes适合jpanel的大小。如果容器中有任何额外的垂直空间,我希望它保持自由状态。


JPanel的默认布局是FlowLayout,并且默认构造函数创建"默认的5单位水平和垂直间隙"。 您可以不指定空格:

1
JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));

此外,JCheckBox UI委托添加了Insets,该值因L&F而异。 我会谨慎地更改这些:大小可以忽略不计,通常需要容纳选择指示。


您是否尝试过将Swing组件的边距和边框插入设置为0?