使用GridBagLayout进行不正确的大小调整

时间:2016-10-27 19:31:08

标签: java swing jpanel layout-manager gridbaglayout

我正在尝试使用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();
        }
}

这就是显示的内容:

https://i.stack.imgur.com/HvguY.png

1 个答案:

答案 0 :(得分:1)

con.gridy = SIZE+1;

您不能指定8的网格值。网格中只添加了两个组件。网格不知道您的某个面板恰好包含7行组件。所以这个值应该是1。

这不会解决问题,但应该清除对GridBagLayout如何工作的误解。

holder.setSize(450, 450);

您正在手动设置框架的大小。每个组件最初的大小都是其首选大小。当框架中有额外的空间时,空间在两个组件之间平均分配。

您不应该设置尺寸。每个组件应确定自己的大小,然后您应使用pack()。因此,您需要使用覆盖getPreferredSize()方法的自定义组件来为每个组件返回适当的大小,以便pack()可以完成其工作。

此外,pack()setVisible()之前完成。