不允许添加组件来调整 JPanel 的大小

Not allow the adding components to resize a JPanel

我有一个使用 GridBagLayout 布局的 parent JPanel parentPanel。在这些面板中,我还有另外 3 个 child JPanels("childPanel1", "childPanel2", "childPanel3"),如下所示:

 _____ _____
|     | 2   |
|  1  |_____|
|     | 3   |
|_____|_____|

我在 BorderLayout.CENTER 的固定大小的 JFrame 中添加了 panelParent,我希望框架保持固定(不可调整大小),600 x 400。 child 面板的宽度都相等,我希望它们 保持相等。
对于 child 面板,我也使用了 GridBagLayout。
我在 childPanel1 中安排了组件,宽度仍然相等。

问题:当我开始将组件添加到 childPanel2 时,它会调整自身和其他 2 个 childPanel 的大小。 child 面板宽度不再相等。 变成这样:

 ____ ______
|    |  2   |
|  1 |______|
|    |  3   |
|____|______|

我有两个问题,

  1. 添加后如何让 child 面板不可调整大小 组件放入其中,所有组件都具有相同的宽度?
  2. 面板的自动调整大小与JPanel有关,parent 布局,child 布局或组件属性?

我刚刚开始了解 Swing。

谢谢!

最简单(但可能不是最好)的方法可能是覆盖每个 child JPanel:

getPreferredSize 方法


代码:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Example {

    public Example() {

        JPanel parentPanel = new JPanel(new GridBagLayout());
        parentPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;
        gbc.weighty = 1;
        gbc.weightx = 1;
        gbc.gridheight = 2;
        parentPanel.add(createChildPanel(1), gbc);
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.gridheight = 1;
        parentPanel.add(createChildPanel(2), gbc);
        gbc.gridx = 1;
        gbc.gridy = 1;
        parentPanel.add(createChildPanel(3), gbc);

        JFrame frame = new JFrame();
        frame.getContentPane().setLayout(new GridBagLayout());
        frame.getContentPane().add(parentPanel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 400);
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private JPanel createChildPanel(int number) {
        JPanel panel = new JPanel(new BorderLayout()) {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(150, 150);
            }
        };

        JPanel addPanel = new JPanel();
        addPanel.setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, Color.LIGHT_GRAY));

        JButton addButton = new JButton("+");
        addButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                addPanel.add(new JLabel("Label"));
                addPanel.revalidate();
                addPanel.repaint();
            }
        });

        JButton deleteButton = new JButton("-");
        deleteButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                if (addPanel.getComponentCount() > 0) {
                    addPanel.remove(addPanel.getComponent(addPanel.getComponentCount() - 1));
                    addPanel.revalidate();
                    addPanel.repaint();
                }
            }
        });

        JPanel buttonPanel = new JPanel();
        buttonPanel.add(addButton);
        buttonPanel.add(deleteButton);

        JLabel label = new JLabel(String.valueOf(number));
        label.setHorizontalAlignment(JLabel.CENTER);

        panel.setBorder(BorderFactory.createLineBorder(Color.GRAY));
        panel.add(label, BorderLayout.NORTH);
        panel.add(addPanel);
        panel.add(buttonPanel, BorderLayout.SOUTH);
        return panel;
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Example();
            }
        });
    }

}