Java 使用pack()自动调整JFrame的大小,而不折叠其JPanel
我正在尝试设计一个包含两个不同JPanel的JFrame,一个在左侧,带有AbsoluteLayout,另一个在右侧,带有可变尺寸的GridLayout 在将一些组件添加到JPanel之后,我将它们添加到JFrame contentPane,并使用JFrame.pack()方法,希望得到一个能够显示其所有组件的最小尺寸的JFrame,但我得到的是最小尺寸,仅显示右侧带有GridLayout的JPanel,左边的JPanel与右边的JPanel重叠 有没有什么好方法可以使用JFrame.pack()方法,但它仍然完整地显示了这两个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(
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;ipack()
仅在使用布局管理器时才起作用,因为pack()
本身查询布局管理器所需的维度,因此在这里不能使用绝对布局,pack()
不要使用null
布局。这是问题的根源(以后可能会产生更多问题)。布局为null
的面板没有合理的首选大小,因为计算此大小通常是布局管理器的工作。您还可以覆盖getPreferredSize()
,但在这种情况下,您不应该使用布局管理器,因为没有充分的理由不使用布局管理器。请注意,两个绝对定位的按钮可以使用单列GridLayout
和EmptyBorder
轻松布局。要确保它们只占用所需的大量空间,请添加(带的面板)使用FlowLayout
将网格布局切换到另一个面板。这比尝试解决尝试绝对定位将导致的无数问题容易得多。