Java 如何在面板显示之前获取由Miglayout管理器设置的面板边界?
有三种不同类型的面板,每种面板跨越不同数量的网格。1*3,1*1,3*1Java 如何在面板显示之前获取由Miglayout管理器设置的面板边界?,java,swing,miglayout,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”。但要知道它是否与另一个面板重叠,我必须知道它的边界 我没有设置任何尺寸限制 有没有办法知道“面板/组件实际显示前的边界” 还有,如何知道MigLay
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面板重叠 我可以想出两种方法,不是很好也不是很漂亮,都有同样的问题 布局可以连续重复出现(也就是说,您将被一系列要求快速连续布局容器的请求击垮) 陷阱试图找出它何时停止。下一个问题是你造成的 调用
super.doLayout
后,您“可以”覆盖父级Container
sdoLayout
方法。您将有权访问生成的布局。这不是最好的解决方案,因为它要求您实现您可能不想实现的容器
我能想到的另一个解决方案是在panel1
上使用ComponentListener
监视componentresisted
事件
我会认真地玩玩这些游戏,看看你会给自己带来什么麻烦。一个更好的解决方案是尝试提前解决布局问题。我可以想出两种方法,不是很好,也不是很漂亮,都会遇到同样的问题
布局可以连续重复出现(也就是说,您将被一系列要求快速连续布局容器的请求击垮)
陷阱试图找出它何时停止。下一个问题是你造成的
调用super.doLayout
后,您“可以”覆盖父级Container
sdoLayout
方法。您将有权访问生成的布局。这不是最好的解决方案,因为它要求您实现您可能不想实现的容器
我能想到的另一个解决方案是在panel1
上使用ComponentListener
监视componentresisted
事件
我会认真地玩玩这些游戏,看看你会给自己带来什么麻烦。更好的解决方案是提前尝试解决布局问题。JPanel
(默认情况下对每个Swing JComponents
)在两种情况下返回其大小或边界
如果在屏幕上显示一次
在pack()之后
到顶层容器
对于标准布局管理器
,或者对于miglaway,JPanel
(默认情况下对每个Swing JComponents
)来说,没有理由知道这些值中的任何一个,在两种情况下返回其大小
或边界
如果在屏幕上显示一次
在pack()之后
到顶层容器
对于标准布局管理器
,或者对于miglaway,我没有理由知道任何这个值,我又遇到了类似的问题,但这次我得到了答案,我可能会对某人有所帮助,所以我将它发布在这里
addAncestorListener(new AncestorListener() {
@Override
public void ancestorAdded(AncestorEvent event) {
height = getHeight();
width = getWidth();
//Modifications to the components here.
}
我希望LayoutManager在编译时设置维度(这是不可能的)。一旦组件在屏幕上显示出来,AncestorListener就完成了这项任务。它捕获了尺寸并相应地修改了组件。我又遇到了类似的问题,但这次我得到了答案,我可能会对某人有所帮助,所以我将其发布在这里
addAncestorListener(new AncestorListener() {
@Override
public void ancestorAdded(AncestorEvent event) {
height = getHeight();
width = getWidth();
//Modifications to the components here.
}
我希望LayoutManager在编译时设置维度(这是不可能的)。一旦组件在屏幕上显示出来,AncestorListener就完成了这项任务。它捕获了尺寸并相应地修改了组件。不明白“重叠”是什么意思-你到底想实现什么?许多推送约束有点不寻常。。。条件布局不受支持,afaik(大多数情况下不需要)请给出一个示例,最好是代码,至少是草图。我不明白“重叠”是什么意思-你到底想实现什么?许多推送约束有点不寻常。。。不支持条件布局,afaik(大多数情况下不需要)请给出一个示例,最好是代码,至少是一个sketchHmm。。。是的,但我只是想知道是否有任何方法或黑客存在预先知道我的布局经理将要做什么。无论如何,谢谢你抽出时间。嗯。。。是的,但我只是想知道是否有任何方法或黑客存在预先知道我的布局经理将要做什么。无论如何,谢谢你的时间。我只是简单地强迫用户输入偶数个矩形,或者在用户输入奇数个矩形时给自己添加一个。对不起,之前的信息太少了。谢谢你宝贵的时间。我只是简单地强迫用户输入偶数个矩形,或者如果用户输入奇数个矩形,我自己添加了一个。对不起,之前的信息太少了。谢谢你宝贵的时间。