java - 消除面板上复选框之间的巨大差距

标签 java swing layout-manager grid-layout jtabbedpane

它是非常基本的 UI,但我无法设置 JCheckBox 按钮,以便它们紧挨着另一个(垂直)放置,没有任何间距。我将如何减少下面看到的间距?

JPanel debugDrawPanel = new JPanel(new GridLayout(0,1));         
JPanel eastPanel = new JPanel(new GridLayout(1,0));
JTabbedPane tab = new JTabbedPane();

click = new ClickPanel(this);

setSettings(new Settings());

for (Setting setting: getSettings().getAll()){

    JCheckBox checkBox = new JCheckBox(setting.name);
    checkBox.setName(setting.name);
    checkBox.addItemListener(new CheckBoxItemListener(this));
    debugDrawPanel.add(checkBox);
}

tab.addTab("Object Parameters", click);
tab.addTab("Debug Draw", debugDrawPanel);

screenshot

最佳答案

看起来最小垂直尺寸是由另一个选项卡的内容设置的。解决这个问题的一种方法是在将带边框布局的面板放入选项卡式 Pane 之前,将 GridLayout 放在 BorderLayoutPAGE_START 中。

enter image description here

  • 带有 GridLayout 的面板有一个橙色的 BG。
  • 带有 BorderLayout 的面板有一个黄色的 BG。

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class TopAlignedComponents {

    private JComponent ui = null;

    TopAlignedComponents() {
        initUI();
    }

    public void initUI() {
        if (ui!=null) return;

        ui = new JPanel(new BorderLayout(4,4));
        ui.setBorder(new EmptyBorder(4,4,4,4));

        JTabbedPane tb = new JTabbedPane();
        ui.add(tb);
        Image spacer = new BufferedImage(300, 100, BufferedImage.TYPE_INT_RGB);
        tb.addTab("Spacer", new JLabel(new ImageIcon(spacer)));

        String[] labels = {"Shapes", "Joints", "AABBs"};
        JPanel checkPanel = new JPanel(new GridLayout(0, 1, 4, 4));
        checkPanel.setBackground(Color.ORANGE);
        for (String label : labels) {
            checkPanel.add(new JCheckBox(label));
        }

        JPanel checkConstrain = new JPanel(new BorderLayout());
        checkConstrain.setBackground(Color.YELLOW);
        checkConstrain.add(checkPanel, BorderLayout.PAGE_START);

        tb.addTab("Check", checkConstrain);
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                TopAlignedComponents o = new TopAlignedComponents();

                JFrame f = new JFrame("Top Aligned Components");
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);

                f.setContentPane(o.getUI());
                f.pack();
                f.setMinimumSize(f.getSize());

                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

关于java - 消除面板上复选框之间的巨大差距,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27681607/

相关文章:

java - 使用边框布局的 JPanel 定位不起作用

java - 图像在 netbeans 中不旋转

java - 如何在 BoxLayout 中将 JLabel 和 JButton 居中

java - 面板切换在我的测验应用程序中不起作用。我正在使用卡片布局

java - 如何复制/制作 JfreeChart 的副本?

java - 来自已排序数组的 BST 列表

java - Flying Saucer/OpenPdf相同的字符串html内容但不同的字节[]

java - 如何使用具有 JTable 典型功能的 Prefuse 可视化表格

java - 软键盘推送布局

java - 清除JFrame的组件并添加新组件