繁体   English   中英

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

[英]Java GUI: Prevent overlap of dynamically resized Swing components

免责声明:我是新手。

TLDR :我正在用一个按钮动态地将JPanel添加到“封闭”的JPanel中。 所有面板都使用MiGLayout。 外部面板仅包含一个单元格,并且在从上到下添加内部面板时创建更多行(“flowy”约束)。 内部面板由两行组成 - 但第二行是动态显示的(“hidemode 3”布局约束,使用setVisible(false)直到满足条件。)

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

背景

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

  1. 一个封闭的JPanel (黑色),包含:
  2. JToolbar (蓝色)和
  3. JScrollPane (红色),具有Viewport
  4. 另一个JPanel (绿色)

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

来自windowbuilder / eclipse

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

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

小组补充说

随着更多的添加,面板堆叠在彼此的顶部。

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

问题

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

用户添加了三个面板: 3个来源就好了

第二个面板触发setVisible(true) ,所以现在由两行组成,但隐藏第三个面板:

交叠

为了戏剧效果(相同的运行时): 明显重叠

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

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

假设我添加一个面板,然后触发隐藏的行,然后添加另一个面板---仍然有重叠。 我的理解是revalidate()应该处理这些事情,但我已经把它调用到每个可能的地方(如果可能的话,可能太多了)无济于事。

我在封闭面板和内板上尝试了许多不同的限制,没有运气。 我已经尝试了创建第二行并动态显示/隐藏它,或者只是动态地创建它,没有运气。 它始终以相同的方式重叠,我不能让它重新布局这些内部面板。

我可以想到一些工作,但这似乎应该是可能的!

我有史以来最长的问题,对不起。 任何帮助表示赞赏。 谢谢。

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

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

我听说在挥杆时使用pref / max / min界限要谨慎 - 但我忽略了它,这就是发生了什么!

通过完全删除行约束,外部(绿色)面板会移动行和不适当的行。

jframe.getContentPane().revalidate();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM