我正在尝试使用GridBagLayout来创建一个JFrame,其中包含一个具有网格布局的JPanel和一个只有一个大按钮的JPanel。我希望所有行都具有相同的大小,并且具有JButton的JPanel与一行的大小相同。但是,当前为空的按钮面板约为JFrame的1/3。我不太确定发生了什么,但我保持这种结构非常重要,因为我的其余代码都使用了这个。感谢任何帮助,并提前感谢您。
这是我的代码:
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
public class Minesweeper extends JPanel {
private final int SIZE = 7;
public void startGame(){
JFrame holder = new JFrame();
JPanel window = new JPanel();
JPanel pan = new JPanel();
holder.setLayout(new GridBagLayout());
GridBagConstraints con = new GridBagConstraints();
con.weightx = 1;
con.weighty = 1;
con.gridx = 0;
con.gridy = 0;
con.fill = GridBagConstraints.BOTH;
con.gridheight = SIZE;
con.gridwidth = SIZE;
holder.getContentPane().setBackground(Color.darkGray);
holder.setSize(450, 450);
holder.setResizable(false);
holder.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setBackground(Color.darkGray);
window.setLayout(new GridLayout(SIZE, SIZE));
for (int c=0; c<(SIZE*SIZE); c++){
int row = (c/SIZE);
int col = (c%SIZE);
JPanel p = new JPanel();
p.setBackground(Color.gray);
Border b = BorderFactory.createEtchedBorder(EtchedBorder.RAISED);
p.setBorder(b);
window.add(p);
}
holder.add(window, con);
con.gridx = 0;
con.gridy = SIZE+1;
con.gridheight = 0;
con.gridwidth = SIZE;
holder.add(pan, con);
holder.setVisible(true);
}
public static void main(String[] args){
Minesweeper start = new Minesweeper();
start.startGame();
}
}
这就是显示的内容:
答案 0 :(得分:1)
con.gridy = SIZE+1;
您不能指定8的网格值。网格中只添加了两个组件。网格不知道您的某个面板恰好包含7行组件。所以这个值应该是1。
这不会解决问题,但应该清除对GridBagLayout如何工作的误解。
holder.setSize(450, 450);
您正在手动设置框架的大小。每个组件最初的大小都是其首选大小。当框架中有额外的空间时,空间在两个组件之间平均分配。
您不应该设置尺寸。每个组件应确定自己的大小,然后您应使用pack()
。因此,您需要使用覆盖getPreferredSize()
方法的自定义组件来为每个组件返回适当的大小,以便pack()可以完成其工作。
此外,pack()
在setVisible()
之前完成。