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

Java GUI:防止动态调整大小的Swing组件重叠

彭飞虎
2023-03-14

免责声明:我是新来的。

TLDR:我用一个按钮将JPanel动态添加到“封闭”JPanel中。所有面板均使用MiGLayout。外部面板仅包含一个单元格,添加内部面板时会创建更多行,从上到下(“流动”约束)。内部面板由两行组成,但第二行是动态显示的(“隐藏模式3”布局约束,设置可见(false),直到满足条件为止。)

正在发生的事情是,当添加一个内部面板,并使其第二行可见时,它与它下面的面板重叠。我试图尽可能调用重新验证和重新绘制。对我来说,似乎外部/封闭面板只需重新验证其子组件,但这似乎并没有发生。

我正在使用MiGLayout和Swing创建一个GUI以导入我的数据库。用户应该能够点击一个按钮,将面板添加到封闭面板。具体来说,[有问题的]GUI的[部分]由...

  1. 一种封闭的JPanel(黑色),包含一个:

最后一个JPanel是一个容器,用于通过按钮动态添加面板(请参见下面的第二张图片)。

最底部的JPanel#4使用MiGLayout。它本身以及包含它的滚动窗格都隐藏在视图中,直到用户点击“文件”组合框旁边的按钮。(上图未显示,因为那不是运行时)。

按下后,JPanel的一个子类被添加到此面板:(运行时屏幕截图)

当添加更多面板时,面板相互堆叠。

此内部面板由两行组成,但第二行是不可见的,在可见之前不会影响布局。一旦文本字段中的条件满足,它就会通过侦听器可见。。

如果内部面板的第二行变为可见,则它与其下一行中的面板重叠。我的意思是。。。。

第二个面板触发setViable(true),所以now由两行组成,但隐藏了第三个面板:

问题很明显。我如何防止这种重叠?

理想情况下,我希望out面板能够适当地重新组织,以适应更大的尺寸。

假设我添加一个面板,然后触发隐藏行,然后添加另一个面板——仍然有重叠。我的理解是revalida()应该处理这些事情,但我已经尽可能地调用了它(如果可能的话,可能太多了??),但没有用...

我在封闭面板和内部面板上尝试了许多不同的约束,但都没有成功。我尝试过创建第二行并动态显示/隐藏它,或者只是动态创建它,但没有成功。它始终以相同的方式重叠,我无法让它重新布局这些内部面板。

我能想到一些解决办法,但这似乎是可能的!

我有史以来最长的问题,抱歉。感谢任何帮助。谢谢。

共有2个答案

姬慎之
2023-03-14
jframe.getContentPane().revalidate();
公孙宸
2023-03-14

事实证明,在(绿色)外部面板上设置行约束是导致问题的原因。

我将最小/首选行大小设置为30像素,最大大小为60像素(60是两行内部面板的大小)。显然,这并没有做我认为应该做的事情。

我听说在swing中使用pref/max/min界限时很谨慎,但我忽略了它,这就是发生的事情!

通过完全删除行约束,外部(绿色)面板将移动行以及不适当的内容。

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

  • 在tkinter中调整窗口大小时,有没有办法动态调整小部件的大小? 这是代码: 当我调整窗口大小时,窗口小部件的宽度和高度保持不变。 我想要的是根据窗口的大小动态调整窗口小部件的大小。 有没有办法在tkinter中实现这一点? 如果有人能帮我,那就太好了。

  • 本文向大家介绍C#动态调整数组大小的方法,包括了C#动态调整数组大小的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#动态调整数组大小的方法。分享给大家供大家参考。具体如下: 通常,我们创建一个数组后就不能调整其长度,但是Array类提供了一个静态方法CreateInstance用来创建一个动态数组,所以我们可以通过它来动态调整数组的长度。 希望本文所述对大家的C#程序设计有所帮助

  • 问题内容: 我想禁用窗口大小调整。有任何想法吗? 问题答案: 您可以使用two-arg构造函数指定样式位。默认样式位是: 您实际上想排除该位。如果您要创建自己的: 如果要扩展,则可以通过覆盖来影响Shell样式位:

  • 如何动态调整列的大小以支持可能的不规则数组? 上面的代码会分配每个col的长度吗? 事先谢谢你的帮助。