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

时间:2015-03-05 02:17:35

标签: java swing jpanel layout-manager miglayout

免责声明:我是新手。

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

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

背景

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

  1. 一个封闭的JPanel(黑色),其中包含:
  2. JToolbar(蓝色)和
  3. JScrollPane(红色),其Viewport
  4. 另一个JPanel(绿色)
  5. 这最后一个JPanel,#4是一个通过按钮动态添加面板的容器(参见下面的第二张图片)。

    from windowbuilder/eclipse

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

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

    panel added

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

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

    问题

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

    用户添加三个面板: 3 sources just fine

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

    overlap

    对于戏剧效果(相同的运行时): obvious overlapping

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

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

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

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

    我可以想到一些解决方法,但这似乎应该是可能的!

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

2 个答案:

答案 0 :(得分:0)

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

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

我听说在挥杆时使用pref / max / min界限要小心 - 但是我忽略了它,这就是发生的事情!

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

答案 1 :(得分:0)

jframe.getContentPane().revalidate();