等待GUI完全更新?

时间:2015-02-22 09:06:52

标签: java multithreading swing

我有一些带有可滚动面板的标签,其中包含一系列标签。标签可以是“聚焦的”,在这种情况下,它们将保持完美居中,因为切换标签,调整窗口大小或改变字体大小。我已完成所有数学计算。唯一的问题是代码运行时。以下功能......

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中的一种简单方法,这当然不是。基本上是:

  • 外部值更新 - 调整大小,更改字体等;
  • 等待布局 100%完成,所有标签和家长都会以新的尺寸结算;
  • 根据新尺寸申请保证金;
  • 等待布局再次更新100%,可滚动范围最终确定;
  • 使用当前数字将滚动条移动到确定的位置。

以下等待用户界面完全更新,原因我不确定:

revalidate()
doLayout()
SwingUtilities.invokeLater()

我准备抛出一个黑客工作,在运行代码之前暂停一个线程一毫秒,但我想我会问,看看是否有任何方便的waitForLayoutUpdate()函数,我只是避风港还没找到。

经过进一步研究,我发现JLabel特别是在检查时没有报告正确的高度。这是他们已知的问题,但我还没有找到解决办法。

0 个答案:

没有答案