我正在尝试设计一个JFrame,其中有两个不同的JPanel,一个在左边有AbsoluteLayout,另一个在右边有可变维度的GridLayout。
在将一些组件添加到JPanels后,我将它们添加到JFrame contentPane中,并使用方法JFrame.pack()希望获得一个具有最小大小的JFrame,该最小大小可以显示其所有组件,但我得到的是,最小大小仅显示右侧带有GridLayout的JPanel,左侧的JPanell与右侧的JPaneel重叠。
有没有什么好的方法可以使用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);
}
}
pack()
仅在与布局管理器配合使用时有效,因为pack()
本身会向布局管理器查询所需的维度,因此在这里,不能使用绝对布局和pack()
。