在做其他事情之前确保 AWT Canvas 被绘制在屏幕上

Ensure that AWT Canvas is drawn on-screen before doing something else

在我的应用程序中,我需要确保 Canvas 在进行下一步之前确实出现在屏幕上。原因是我需要检索 AWT Drawable - 即 canvas 的原生 window 表面。如果 canvas 不可见,则该可绘制对象将无效,即使它的标志“可见”设置为 true。

我遇到的问题是我无法确定 Java 实际决定显示它的时间。

我什至写了一个代码在 Canvas 构造函数之后实际延迟,但实际情况是它在延迟到期后显示。

canvas3d = new Canvas3d();
System.err.println("Before sleep");
try
{
   Thread.sleep(3000);
}
catch (Exception e) {}
System.err.println("After sleep");
canvas3d.Init();

这很奇怪,因为元素的绘制和渲染应该由一个完全独立的线程处理,而我的主线程休眠理论上应该给它足够的时间来处理这些东西。但它仍然等待某种原因。 添加 Repaint() 或 revalidate() 没有帮助。

问题在于,有时 canvas 在 Init() 到达需要它可见的点之前就已显示。但其他时候 - 它不会在此之前显示。

我能否以某种方式强制应用程序在执行任何其他操作之前显示该元素?或者我可以以某种方式检索此时是否显示 canvas 吗?因为检查 Canvas.visible 是没有意义的——无论它是真还是假,并不意味着它在运行时的那个精确时刻实际显示或隐藏。这只是一个表明它应该被显示的标志,但是哦,糟糕,Java 只是不能保证它确实是!

看来我可以使用 canvas.isShowing() 来测试它是否真的在屏幕上可见。至少通过检查那个参数我得到了我想要的结果(到目前为止)。

我仍然不确定这是否足够以及是否还有其他问题可能在低级别出错,特别是如果我尝试在 AWT 已经完全“显示”组件的 X11 渲染管道期间访问表面但是X11 还没有完成在屏幕上的绘制。 这是一个问题。

但就目前而言,这似乎是我能想到的最佳答案。