在 JLayeredPane 中将 JFrame 的大小调整为 JPanels

Resize JFrame to JPanels inside JLayeredPane

我正在使用 JLayeredPane 开发 Swing GUI。 JFrame 有一个 JLayeredPane,其中包含两个 JPanel。稍后我想在 JPanel 中显示一些组件,我将这部分代码剪掉以使其更短。

如何将 JFrame 的大小调整为 JPanel 的大小? frame.pack() 不起作用,如果没有设置首选大小,GUI 将以最小尺寸显示。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagLayout;

import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

public class TestGUI {
    private JFrame frame;
    private JLayeredPane layeredPane;
    private JPanel panelBottom;
    private JPanel panelTop;
    private MainMenuBar menuBar;

    public TestGUI() {
        // panel bottom:
        panelBottom = new JPanel();
        panelBottom.setSize(1000, 500);
        panelBottom.setBackground(new Color(0, 100, 0, 100));
        panelBottom.setLayout(new GridBagLayout());
        // panel top:
        panelTop = new JPanel();
        panelTop.setSize(950, 450);
        panelTop.setBackground(new Color(0, 0, 100, 100));
        panelTop.setLayout(new GridBagLayout());
        // layered pane:
        layeredPane = new JLayeredPane();
        layeredPane.add(panelBottom, 1);
        layeredPane.add(panelTop, 0);
        // frame building:
        frame = new JFrame();
        menuBar = new MainMenuBar();
        frame.setJMenuBar(menuBar);
        frame.setLayout(new BorderLayout());
        frame.setPreferredSize(new Dimension(1100, 600)); // <-- Without this the GUI will be very small
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(layeredPane, BorderLayout.CENTER);
        frame.pack(); // <-- does not work!
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new TestGUI();
    }
}

编辑:我可以更改首选大小线以适合最大的 JPanel,但我问这个问题是因为我希望 JFrame 根据 JPanel 的大小动态调整大小.

How to Use Layered Panes: Laying Out Components in a Layered Pane, "Although a layered pane has no layout manager by default, you can still assign a layout manager to the layered pane." Use OverlayLayout, seen here 中所建议,用于重叠面板。

或者,使用 JInternalFrame, which does allow you to pack() the internal frames individually, as shown here and here