如何在显示之前获取由Miglayout manager设置的面板边界?

时间:2012-08-10 14:37:37

标签: java swing miglayout

有三种不同类型的面板,每种面板跨越不同数量的网格。 1 * 3,1 * 1,3 * 1.

add(panel1, "span 1 3,push, grow");
add(panel2, "push, grow");
add(panel3, "span 3 1,push, grow");

我想将第一个面板的约束更改为“span 1 2”,当它与屏幕上的其他面板重叠时。但要弄清楚它是否与另一个小组重叠,我必须知道它的界限。

我没有设置任何大小限制。

有没有办法知道'实际显示面板/组件之前的界限'?

另外,如何知道MigLayout管理器设置的行和列的长度?

实际上我想用这些不同尺寸的面板覆盖整个屏幕。

编辑:

我忘了输入主要罪魁祸首... add(lastPanel, span, push, grow)

我试图用不同尺寸的面板覆盖整个屏幕。此代码适用于偶数个矩形,但不适用于奇数。当它们的数量为奇数时,则最后一个网格始终为空。所以我跨越最后一个面板来覆盖整个空的可用空间,但随后它与3 * 1面板重叠。

3 个答案:

答案 0 :(得分:1)

我可以想到几种方式,不是很好或很漂亮,而且都受到同样的问题。

布局可以连续重复发生(也就是说你会被快速连续布局容器的许多请求所破坏)

陷阱试图弄清楚何时停止。当你造成它时,下一个问题是已知的。

您“可以”覆盖父Container doLayout方法,在您调用super.doLayout后,您将可以访问生成的布局。这不是最佳解决方案,因为它要求您实施您可能不想要的Container

我能想到的另一个解决方案是使用ComponentListener panel1来监控componentResized事件。

我会认真玩这些,看看你遇到了什么麻烦。更好的解决方案是提前尝试解决布局问题。

答案 1 :(得分:1)

JPanel(默认情况下对每个Swing JComponents有效)在两种情况下返回SizeBounds

  1. 如果在屏幕上一次显示

  2. {li>

    pack()之后Top-Level Container

    没有理由知道Standard LayoutManagers的任何值,也不知道MigLayout,

答案 2 :(得分:1)

我又遇到了类似的问题,但这次我得到了答案,我可能对某人有帮助,所以我在这里发帖。

addAncestorListener(new AncestorListener() {
        @Override
        public void ancestorAdded(AncestorEvent event) {
                height = getHeight();
                width = getWidth();
                //Modifications to the components here.
        }

我想要在编译时由LayoutManager设置的尺寸(这是不可能的)。一旦组件布局在屏幕上,AncestorListener就会做到这一点。它捕获尺寸并相应地修改组件。