gpt4 book ai didi

java - MigLayout:如何按宽度比例调整高度(保持纵横比)?

转载 作者:太空宇宙 更新时间:2023-11-04 07:35:49 25 4
gpt4 key购买 nike

我正在使用 MigLayout 在网格中排列图像。我可以获得宽度来占据列中的整个可用空间,但随后我希望高度相应地增长,以便图像的比例仍然固定。

最好的方法是什么?我可以使用约束中的表达式来做到这一点,还是必须重写 getPreferredSize()?

谢谢!

最佳答案

经过大量研究后,我意识到使用 Swing 没有很好的方法来做到这一点。这个问题不仅来自 MigLayout,还来自像 ScrollPaneLayout 这样的布局,它假设在不同的有效宽度(不是首选宽度)后首选高度将保持不变。

有两个选项:

1) 目前,我正在使用宽高比组件约束来实现自己的 MigLayout。您可以从这里下载:

https://github.com/lqbweb/miglayout-aspect

到目前为止,它可以在具有 1 个组件/单元的简单网格情况下缩小和增大 X。我仍然需要测试跨越、在单元中流动和对接......我将保持该存储库的更新,欢迎任何帮助。

由于您可能会将其用作 ViewPort 上的 View ,因此如果将其与返回 true 的 Scrollable.getScrollableTracksViewportWidth() 一起使用,则必须对 View 的 getPreferredSize 进行一些修改,因此它不会返回真正的首选高度,而是返回与宽度匹配的高度。在我的代码中,有一个网格的 setter/getter ,并且网格有一个函数可以返回给定宽度的首选高度。

2)保持 MigLayout 的当前实现不变(在本答案时为 4.2),我只找到了一种方法来实现此目的:通过向布局添加回调并使用如下方式实现 getSize() 方法:

    migLayout.addLayoutCallback(new LayoutCallback() {

/**
* This is run before the layout starts laying out
*/
@Override
public BoundSize[] getSize(ComponentWrapper comp) {
if(comp.getComponent() instanceof DCMImageWrapper) {
DCMImageWrapper img=(DCMImageWrapper) comp.getComponent(); //this is the BufferedImage embedded in a JLabel
int calculatedHeight=img.getHeightFor(comp.getWidth());
UnitValue maxHeight=new UnitValue(calculatedHeight);
BoundSize height=new BoundSize(maxHeight, maxHeight, maxHeight, null);

return new BoundSize[]{null, height};
} else {
return null;
}
}

private double getCurrentAspect(ComponentWrapper comp) {
if(comp.getWidth()==0 || comp.getHeight()==0) return 0;
double currentAspect=comp.getWidth()/(double)comp.getHeight();
return currentAspect;
}

/**
* Check if the aspect still valid
*/
@Override
public void correctBounds(ComponentWrapper comp) {
if(comp.getComponent() instanceof DCMImageWrapper) {
DCMImageWrapper img=(DCMImageWrapper) comp.getComponent();

double currentAspect=getCurrentAspect(comp);
double origAspect=img.getDCMImage().getAspect();
double currentError=Math.abs(origAspect-currentAspect);
if(currentError > img.getDCMImage().getAspectError()) {
//recalculate layout
revalidate();
}
}
}

});

然后添加组件,例如:

CC constraints=new CC();
constraints.shrinkX(100);
constraints.minWidth("1");
constraints.minHeight("1");
add(tmpImg, constraints);

但是,您必须添加并不断更新布局约束 (LC),以手动设置布局的首选大小,因为在回调之后它会产生偏差。

关于java - MigLayout:如何按宽度比例调整高度(保持纵横比)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16902256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com