Java GridBagLayout JPanels是否自动调整问题大小?

Java GridBagLayout JPanels是否自动调整问题大小?,java,swing,jpanel,jlabel,gridbaglayout,Java,Swing,Jpanel,Jlabel,Gridbaglayout,我需要帮助调整红色JPanel的大小。基本上,问题是我为红色和蓝色JPanel设置了相同大小的网格包约束,它工作得非常完美,直到我添加了JLabel,然后它才愚蠢地开始使红色JPanel变大,但它应该与蓝色JPanel的大小相同,应该保持0.05大小。如果您能帮助我,我将不胜感激,提前非常感谢:) 不需要第一条语句,因为setLocationRelativeTo(…)将重置位置 constructAppFrame(); constructTopMenuBar(); 在框架可见后,不要将组件添

我需要帮助调整红色JPanel的大小。基本上,问题是我为红色和蓝色JPanel设置了相同大小的网格包约束,它工作得非常完美,直到我添加了JLabel,然后它才愚蠢地开始使红色JPanel变大,但它应该与蓝色JPanel的大小相同,应该保持0.05大小。如果您能帮助我,我将不胜感激,提前非常感谢:)

不需要第一条语句,因为
setLocationRelativeTo(…)
将重置位置

constructAppFrame();
constructTopMenuBar();
在框架可见后,不要将组件添加到框架中。这两种说法的顺序应该颠倒

它只是愚蠢地开始使红色JPanel变大,但它应该与蓝色JPanel的大小相同,应该保持0.05的大小

这并不愚蠢。这是布局管理器定义良好的行为。每个布局管理器都有自己的规则要遵循。GridBagLayout根据组件的“首选尺寸”工作。当没有组件添加到面板时,首选大小为(10,10),因为JPanel默认使用FlowLayout,并且组件前后的默认间隙为5像素

因此,当额外的空间可用时,GridBagLayout会根据首选大小分配空间,这会导致红色获得更多空间

作为一个快速黑客(在遵循我上面的其他建议后),您可以:

bottomMenuBar.setPreferredSize( topMenuBar.getPreferredSize() );
mainFrame.add(bottomMenuBar, gbc);
现在尺寸将是相同的,因为首选尺寸也是相同的。这种概念验证并不是一个很好的解决方案,因为即使您更改了红色面板,蓝色面板的首选大小也会变得固定


也许更好的解决办法是使用。此布局将根据框架中的可用空间而不是首选尺寸来确定组件的尺寸,因此,如果红色/蓝色面板具有相同的相对尺寸,则即使添加了组件,它们也应具有相同的尺寸。

红色面板的要求已更改,需要占用更多空间,这是布局管理器的重点,但如果你看标签有这么多的可用空间,我设置标签的背景只是为了看看它占用了多少空间,原始大小足以容纳标签,如果不是,它应该稍微变大,但在我的例子中,它的体积实在是太大了。我最终没有使用网格袋布局:)我实际上要求它们的尺寸与我给它们的尺寸完全相同,以便有足够的空间放置我将放置的其他组件,而不是为了更好、清晰的解释。
constructAppFrame();
constructTopMenuBar();
bottomMenuBar.setPreferredSize( topMenuBar.getPreferredSize() );
mainFrame.add(bottomMenuBar, gbc);