免责声明:我是新手。
TLDR :
我正在动态地将JPanel添加到"封闭"带按钮的JPanel。所有面板都使用MiGLayout。外部面板仅包含一个单元格,并且在从上到下添加内部面板时创建更多行(" flowy"约束)。内部面板由两行组成 - 但第二行是动态显示的(" hidemode 3"布局约束,setVisible(false)
,直到满足条件。)
发生了什么,是在添加内部面板并使其第二行可见时,它与下面的面板重叠。我试图调用revalidate并在任何地方重绘。对我来说,外部/封闭面板似乎只需要重新验证其子组件,但这似乎并没有发生。
我正在使用MiGLayout和Swing来创建用于导入我的数据库的GUI。 用户应该能够点击一个按钮,将面板添加到封闭面板。 具体而言,[问题]的[部分]由......构成。
JPanel
(黑色),其中包含:JToolbar
(蓝色)和JScrollPane
(红色),其Viewport
JPanel
(绿色)这最后一个JPanel
,#4是一个通过按钮动态添加面板的容器(参见下面的第二张图片)。
最底层的JPanel#4使用MiGLayout。它本身以及包含它的滚动窗格在视图中隐藏,直到用户点击"文件"旁边的那个按钮。组合框。 (上图中没有显示,因为那不是运行时间。)
按下后,JPanel的子类将添加到此面板: (运行时截图)
随着更多的添加,面板堆叠在彼此的顶部。
此内部面板由两行组成,但第二行不可见,在可见之前不会影响布局。一旦在文本字段中满足条件,它就会通过监听器可见。
如果内部面板的第二行变得可见,则它会覆盖其下方行中的面板。这就是我的意思....
用户添加三个面板:
第二个面板触发setVisible(true)
,所以现在由两行组成,但隐藏了第三个面板:
对于戏剧效果(相同的运行时):
问题很明显。如何防止这种重叠?
理想情况下,我希望out面板能够适当地重新组织以适应更大的尺寸。
假设我添加一个面板,然后触发隐藏的行,然后添加另一个面板---仍然有重叠。我的理解是revalidate()
应该照顾这些事情,但我已经把它称之为可能的每一个地方(如果可能的话,也许太多了)都无济于事。
我在封闭面板和内部面板上尝试了许多不同的限制,没有运气。我已经尝试了创建第二行并动态显示/隐藏它,或者只是动态地创建它,没有运气。它始终以相同的方式重叠,我不能让它重新布局这些内部面板。
我可以想到一些解决方法,但这似乎应该是可能的!
我有史以来最长的问题,对不起。任何帮助表示赞赏。 感谢。
答案 0 :(得分:0)
事实证明,在(绿色)外部面板上设置行约束是造成问题的原因。
我将最小/首选行大小设置为30像素,最大大小为60像素(60是两行内部面板的大小)。显然,这并没有达到我的想象。
我听说在挥杆时使用pref / max / min界限要小心 - 但是我忽略了它,这就是发生的事情!
通过完全删除行约束,外部(绿色)面板会移动行和不适当的行。
答案 1 :(得分:0)
jframe.getContentPane().revalidate();