Java 使用pack()自动调整JFrame的大小,而不折叠其JPanel

Java 使用pack()自动调整JFrame的大小,而不折叠其JPanel,java,swing,layout-manager,null-layout-manager,Java,Swing,Layout Manager,Null Layout Manager,我正在尝试设计一个包含两个不同JPanel的JFrame,一个在左侧,带有AbsoluteLayout,另一个在右侧,带有可变尺寸的GridLayout 在将一些组件添加到JPanel之后,我将它们添加到JFrame contentPane,并使用JFrame.pack()方法,希望得到一个能够显示其所有组件的最小尺寸的JFrame,但我得到的是最小尺寸,仅显示右侧带有GridLayout的JPanel,左边的JPanel与右边的JPanel重叠 有没有什么好方法可以使用JFrame.pack(

我正在尝试设计一个包含两个不同JPanel的JFrame,一个在左侧,带有AbsoluteLayout,另一个在右侧,带有可变尺寸的GridLayout

在将一些组件添加到JPanel之后,我将它们添加到JFrame contentPane,并使用JFrame.pack()方法,希望得到一个能够显示其所有组件的最小尺寸的JFrame,但我得到的是最小尺寸,仅显示右侧带有GridLayout的JPanel,左边的JPanel与右边的JPanel重叠

有没有什么好方法可以使用JFrame.pack()方法,但它仍然完整地显示了这两个JPanel

代码如下:

public class GameGUI extends JFrame{

   private int labSize;
   private JFrame mainFrame;
   private JPanel labPanel;
   private JPanel choicesPanel;
   private JButton exitButton;
   private JButton replayButton;

   public GameGUI(int n) {

        labSize=n;    
        mainFrame = new JFrame("Maze Game");
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.getContentPane().setLayout(new GridLayout(1, 0));
        mainFrame.setVisible(false);    
        labPanel=new JPanel(new GridLayout(labSize,labSize));    
        choicesPanel=new JPanel(new GridLayout(0, 1));
        choicesPanel.setLayout(null);           
        replayButton=new JButton("Replay");
        replayButton.setBounds(10, 11, 80, 30);         
        exitButton=new JButton("Exit");
        exitButton.setBounds(10, 51, 80, 30);    
        choicesPanel.add(replayButton);
        choicesPanel.add(exitButton);           
        mainFrame.getContentPane().add(choicesPanel);
        mainFrame.getContentPane().add(labPanel);
    }

    public void refreshLabShowing(char[][] lab){

        labPanel.removeAll();    
        for(int i=0;i<labSize;i++){
            for(int u=0;u<labSize;u++){
                labPanel.add(new JLabel(String.valueOf(lab[i][u])));
            }
        }           
        mainFrame.pack();
        mainFrame.setVisible(true);
    }
}
公共类GameGUI扩展JFrame{
私用字号;
专用JFrame主机;
私人JPanel实验室面板;
私人JPanel选择小组;
私有JButton exitButton;
私有JButton replayButton;
公共游戏GUI(int n){
labSize=n;
大型机=新JFrame(“迷宫游戏”);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.getContentPane().setLayout(新的GridLayout(1,0));
mainFrame.setVisible(false);
labPanel=new JPanel(新网格布局(labSize,labSize));
choicesPanel=new JPanel(新网格布局(0,1));
choicesPanel.setLayout(空);
replayButton=新的JButton(“Replay”);
重放按钮。后退(10,11,80,30);
exitButton=新JButton(“退出”);
出口按钮.立根(10,51,80,30);
choicesPanel.add(replayButton);
choicesPanel.add(退出按钮);
mainFrame.getContentPane().add(choicesPanel);
mainFrame.getContentPane().add(labPanel);
}
公共空白刷新实验室显示(字符[][]实验室){
labPanel.removeAll();

对于(int i=0;i
pack()
仅在使用布局管理器时才起作用,因为
pack()
本身查询布局管理器所需的维度,因此在这里不能使用绝对布局,
pack()

不要使用
null
布局。这是问题的根源(以后可能会产生更多问题)。布局为
null
的面板没有合理的首选大小,因为计算此大小通常是布局管理器的工作。您还可以覆盖
getPreferredSize()
,但在这种情况下,您不应该使用布局管理器,因为没有充分的理由不使用布局管理器。请注意,两个绝对定位的按钮可以使用单列
GridLayout
EmptyBorder
轻松布局。要确保它们只占用所需的大量空间,请添加(带的面板)使用
FlowLayout
将网格布局切换到另一个面板。这比尝试解决尝试绝对定位将导致的无数问题容易得多。