当前位置: 首页 > 知识库问答 >
问题:

使用GridBagLayout不正确的大小

寿高阳
2023-03-14

我试图使用一个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();
        }
}

以下是正在展示的内容:

共有1个答案

阙博容
2023-03-14
con.gridy = SIZE+1;

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

这并不能解决问题,但应该可以消除人们对GridBagLayout工作原理的误解。

holder.setSize(450, 450);

您正在手动设置框架的大小。每个组件最初都按照其首选尺寸进行调整。当框架中有额外空间时,空间在两个组件之间平均分布。

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

另外,pack()是在setVisible()之前完成的。

 类似资料:
  • 我使用了绝对定位(setBounds和null布局),现在开始练习布局管理器,这段代码是用gridbag布局的,但是很少组件没有显示,或者是单元格有一些问题,或者是其他的东西,请帮助!

  • 问题内容: SimpleHttpConnectionManager使用不正确。确保始终调用HttpMethod.releaseConnection(),并且一次只有一个线程和/或方法正在使用此连接管理器。 是否有人知道为什么会出现此错误,并导致我要下载的文件失败或失败,然后重试或下载未完成的文件 谢谢 ! 问题答案: 确保不使用SimpleHttpConnectionManager创建和使用来自多

  • 编辑:它现在可以工作了,我用画布扩展了这个类,将它的大小设置为宽度和高度,然后将它添加到JFrame,然后打包。这管用!但我认为造成这种情况的原因不是尺寸大小,而是我呈现它的方式,我从JFrame中获得了bufferStrategy,而不是画布,这不是应该的方式。

  • 我的Java Swing GUI有问题。首先,我创建了一个带有GridBagLayout的面板,并将所有标签添加到其中。然而,我还在另一个JPanel的右侧创建了一个面板,其中添加了一个按钮和两个滑块,它们应该与标签匹配。 问题是JLabels比另一个面板右侧的组件小,这使得它看起来像这样...... 例如,水选项——JSLIDER(JSLIDER看起来要大得多) 我试图通过将添加到更大的值来使组

  • 问题内容: 我正在使用Linux和C ++。我有一个大小为210732字节的二进制文件,但是seekg / tellg报告的大小为210728。 我从ls-la获得以下信息,即210732字节: -rw-rw-r– 1个pjs pjs 210732 2月17日10:25 output.osr 并使用以下代码段,我得到210728: 所以我的代码关闭了4个字节。我已经确认使用十六进制编辑器可以正确处

  • 我有一些代码生成以下内容: 我希望3、4和5个JTextFields在JLabels旁边,就像1和2一样。我的代码是尝试这样做,但上面的图像是结果。 有人能指出我代码中的问题吗?