java - 如何使用 GridBagLayout 维护 jpanel 的尺寸大小?

标签 java swing resize jpanel gridbaglayout

这是我的代码。当我将程序调整为其他布局时,它工作正常,除了 CheckPanel(使用 GridBagLayout);不知何故,它变大了。我该如何处理?

提前致谢。

JPanel CheckPanel = new JPanel();
CheckPanel.setBackground(Color.WHITE);
GridBagConstraints gbc_CheckPanel = new GridBagConstraints();
gbc_CheckPanel.gridwidth = 2;
gbc_CheckPanel.fill = GridBagConstraints.BOTH;
gbc_CheckPanel.gridx = 0;
gbc_CheckPanel.gridy = 1;
CenterPanel.add(CheckPanel, gbc_CheckPanel);
CheckPanel.setLayout(new GridLayout(0, 6, 0, 0));

enter image description here

enter image description here

最佳答案

约束

gbc_CheckPanel.fill = GridBagConstraints.BOTH;

告诉 GridBagLayout 让这个组件使用任何可用的额外空间(也取决于它的首选和最大尺寸)。使用 GridBagConstraints.NONEGridBagConstraints.VERTICAL 可以解决这个问题,但您仍然必须决定哪个组件将接收额外的空间。

编辑:根据评论,仍然不清楚其他组件是如何插入的,以及额外空间的分配是如何指定的。在此示例中,weighty 字段用于说明表应接收所有额外空间。也许它有助于识别与原始程序的差异:

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class CheckboxConstraints
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI()
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel centerPanel = new JPanel(new GridBagLayout());
        centerPanel.setBackground(Color.RED);

        fill(centerPanel);
        f.getContentPane().setLayout(new GridLayout(1,1));
        f.getContentPane().add(centerPanel);

        f.setSize(500, 300);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    private static void fill(JPanel centerPanel)
    {
        addSearchBar(centerPanel);
        addCheckBoxPanel(centerPanel);
        addTable(centerPanel);
    }


    private static void addSearchBar(JPanel centerPanel)
    {
        GridBagConstraints gbc = null;
        gbc = new GridBagConstraints();
        gbc.gridwidth = 1;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 0;
        gbc.weighty = 0;
        centerPanel.add(new JButton("Search"), gbc);

        gbc = new GridBagConstraints();
        gbc.gridwidth = 1;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.weightx = 1;
        gbc.weighty = 0;
        centerPanel.add(new JTextField(), gbc);
    }

    private static void addCheckBoxPanel(JPanel centerPanel)
    {
        JPanel checkPanel = new JPanel();
        checkPanel.setBackground(Color.WHITE);
        GridBagConstraints gbc_CheckPanel = new GridBagConstraints();
        gbc_CheckPanel.gridwidth = 2;
        gbc_CheckPanel.fill = GridBagConstraints.BOTH;
        gbc_CheckPanel.gridx = 0;
        gbc_CheckPanel.gridy = 1;
        gbc_CheckPanel.weighty = 0;
        centerPanel.add(checkPanel, gbc_CheckPanel);
        checkPanel.setLayout(new GridLayout(0, 6, 0, 0));

        checkPanel.add(new JCheckBox("C0"));
        checkPanel.add(new JCheckBox("C1"));
        checkPanel.add(new JCheckBox("C2"));
        checkPanel.add(new JCheckBox("C3"));
        checkPanel.add(new JCheckBox("C4"));
        checkPanel.add(new JCheckBox("C5"));
    }

    private static void addTable(JPanel centerPanel)
    {
        JTable table = new JTable(new Object[][] {
            {"C00", "C01" },
            {"C00", "C01" },
        }, new Object[]{ "H0", "H1" });
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridwidth = 2;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = 0;
        gbc.gridy = 2;
        gbc.weighty = 1.0;
        JScrollPane scrollPane = new JScrollPane(table);
        centerPanel.add(scrollPane, gbc);
    }

}

关于java - 如何使用 GridBagLayout 维护 jpanel 的尺寸大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21232664/

相关文章:

jquery 在调整窗口大小时计算元素大小

google-app-engine - App Engine 裁剪到特定的宽度和高度

java - 使用编码为 16 进制的字符串创建 BigInt

java - 初始化后 JPanel 的 setSize

java - SetDefaultCloseOperation 参数之间有什么不同?

java - Printable 打印尺寸不正确的 BufferedImage

java - 无法使用 requestDispathser 包含 servlet 响应

java - 兼容的 Java 编译器可以优化此代码吗?

java - 我的 Maven 项目中不存在资源文件夹

Java添加后台后,为什么程序会变慢?