我有一些带有可滚动面板的标签,其中包含一系列标签。标签可以是“聚焦的”,在这种情况下,它们将保持完美居中,因为切换标签,调整窗口大小或改变字体大小。我已完成所有数学计算。唯一的问题是代码运行时。以下功能......
public void fixMargins() {
//Top margin:
final int top = (this.getHeight() - this.getVerseBlock(1).getHeight()) / 2;
//Bottom margin:
final int bottom = (this.getHeight() -this.getVerseBlock(this.view.getComponentCount()).getHeight()) / 2;
this.view.setBorder(new EmptyBorder(top, 0, bottom, 0));
//Set scroll bar accordingly:
this.jumpCenter(this.focused);
}
......有时会奏效。看似每次窗口调整大小时,因为拖动它会导致每个像素更新一次。在最大化时,或在重绘后切换选项卡时,它没有正确聚焦,因为它使用了过时的数字。我已通过控制台输出确认了这一点。
我确切地知道需要发生什么,但我只知道Node.js中的一种简单方法,这当然不是。基本上是:
以下不等待用户界面完全更新,原因我不确定:
revalidate()
doLayout()
SwingUtilities.invokeLater()
我准备抛出一个黑客工作,在运行代码之前暂停一个线程一毫秒,但我想我会问,看看是否有任何方便的waitForLayoutUpdate()函数,我只是避风港还没找到。
经过进一步研究,我发现JLabel特别是在检查时没有报告正确的高度。这是他们已知的问题,但我还没有找到解决办法。