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

奇怪的摆动错误:设置GridLayout参数使我的JPanel消失

宗增
2023-03-14

我不知道我是否犯了一个新手错误,但是在JFrame中为JPanel创建GridLayout时更改row参数,似乎会导致另一个JPanel完全消失:

以下是代码的简化版本:

  • 在GridBug构造函数中,我设置了布局,并将JPanel的一个子类放在BorderLayout.center中。这在我的原始代码中做了其他事情,但这里只是绘制了一个框来显示它正在显示。
  • 添加到borderlayout.page_end的底部面板的状态会导致中心面板消失
  • 特别是,将GridLayout行参数更改为较高的值会导致中心面板消失,较低的值可以正常工作
  • 现在的代码在我的计算机上不起作用,如果我取消注释一些代码以减少行参数,或者如果我不添加JLabel或子面板,那么它就起作用了...

我不知道我做错了什么:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class GridBug extends JFrame{

    static class ImagePanel extends JPanel{

        @Override
        public Dimension getPreferredSize(){
            return new Dimension(200,200);
        }

        @Override
        public void paintComponent(Graphics g){
            super.paintComponent(g);
            System.out.println("Painting image panel...");
            g.setColor(Color.CYAN);
            g.fillRect(0, 0, getWidth(), getHeight());
        }
    }

    public GridBug() {

        setLayout(new BorderLayout());

        /*PROBLEM CODE HERE*/

        //add center image panel - does not appear depending on GridLayout settings in other panels
        ImagePanel centerPanel = new ImagePanel();
        add(centerPanel , BorderLayout.CENTER);

        //add bottom panel
        JPanel bottomPanel = new JPanel();
        add(bottomPanel, BorderLayout.PAGE_END);
        bottomPanel.setLayout(new GridLayout(6,0)); //doesn't work
//              bottomPanel.setLayout(new GridLayout(5,0)); //works

        JPanel subPanel = new JPanel();

        //if I pass more than 4 or so rows as param to gridlayout, 
        //then imagePanel is not displayed
        subPanel.setLayout(new GridLayout(4,0));    //doesn't work
//              subPanel.setLayout(new GridLayout(3, 0)); //works


        //if I don't add this label - works
        JLabel label = new JLabel("A Label:");
        subPanel.add(label);

        bottomPanel.add(subPanel); //if I don't add the subPanel it works fine

        /*END OF PROBLEM CODE?*/

        //set window params
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400,400);
        setLocationRelativeTo(null);
        setVisible(true);
    }   

    public static final void main(String[] args){
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new GridBug();
            }
        });
    }
}

共有1个答案

邹野
2023-03-14

不确定你想要的确切结果,所以我甚至没有尝试。但是您面临的问题是原因之一,您希望pack()您的框架,而不是setsize()。您正在压缩组件的首选大小。pack()尊重所有组件的首选大小,应该使用它,而不是setsize()

bottomPanel.setLayout(new GridLayout(6,0)); //doesn't work..
                                            // with pack(), now it does.
pack();
//setSize(400,400);  // if you increase the size it'll work also, but just pack()

您现在只需要对组件进行布局,以获得您想要的外观:)

对你问题的更详细的解释。

  • 顶部的青色是您的图像面板。
  • 蓝色是包含4行的子面板。使用GridLayout,所有行的大小都将至少是它的最大组件的大小。在这种情况下是标签。您可以看到蓝色区域是标签高度的4倍(应该是这样)
  • 不是红色,红色是底部面板。这有5行。最大的组件是子面板,因此底部面板的总大小是子面板x5的大小,您也可以看到。一旦添加了另一行,顶部面板就会被推出。
 类似资料:
  • 所以我在做这个素数家庭作业,举了一个很好的例子,我想我已经把大部分都记下来了。我遇到的一件事是“公共静态空隙筛(int n)”一行的错误,这也发生在“私有静态int twinPrime()”中 代码如下: 以下是错误: void是变量筛的无效类型 预期令牌 "(", ; 语法错误 令牌 “)” 上的语法错误, ;预期 和 标记“int”语法错误,应为@ 语法错误,请插入“EnumBody”以完成B

  • 问题内容: 我正在使用此代码: 但是在编译时出现此错误: 然后是堆栈跟踪的编译器错误。 我将在课堂开始时同时进行这两种导入: 有什么事吗 在Netbeans中,我看到自动完成选项并且Locale对象没有语法错误… 问题答案: 您的设置有些麻烦,下面的程序对我来说很好用。 它要求源代码的事实使我相信它正在尝试以某种调试模式进行编译或运行。您不需要编译java.util。*的源代码,这很奇怪。 看看我

  • 问题内容: 我目前正在开发一个纯粹的HTML和JavaScript驱动的Web应用程序,该应用程序使用CORS来使用远程Web服务,但目前在IE 11发出GET请求时遇到了麻烦。有趣的是,我们在IE8 / 9/10中可以正常运行,而不仅仅是11。 问题是IE 11似乎超时,而不是等待服务器的响应。ajax调用很简单: 在“网络”选项卡中,使用Fiddler,我可以看到IE从不发送请求。 请问有人有

  • 我最近开始了我的第一个libGDX游戏,一切都进行得很好,所有的东西都呈现得很好,但是大约一分钟后什么都没有呈现,呈现调用仍然被发出,并且spritebatch工作得很好,我只是留下了一个黑屏,我甚至把'gl clearcolor()'改成了但我仍然留下了一个黑屏。我不知道这会是什么。 我的主要类: 编辑:我们已经确定,经过一段时间SpriteBatch渲染一个黑色屏幕的红色清晰颜色,它也停止渲染

  • 我在这个查询中遇到了一个奇怪的问题。代码: 如果我在SQL developer中复制上面的精确查询,它就像魔法一样有效。我试过用“Createquery”来处理实体和所有的东西,同样的错误。 多谢

  • 问题内容: 继承人错误: 这是导致它的代码: 图标是文件数组。奇怪的是,我的计算机可以在任何图像查看器中正常读取图像。谷歌搜索错误没有给我任何结果。我有很多图像需要阅读,因此除了将图像转换为BufferedImage之外,它们是获取图像尺寸的一种替代方法吗?这样可以解决问题吗?有没有办法修复这些图像?我是通过从iOS设备收集应用程序图标来获得它们的。使用我自己的设备进行的测试没有产生任何错误,尽管