【问题标题】:Ensure that AWT Canvas is drawn on-screen before doing something else确保在执行其他操作之前在屏幕上绘制 AWT Canvas
【发布时间】:2020-11-20 23:23:45
【问题描述】:

在我的应用程序中,我需要确保 Canvas 实际出现在屏幕上,然后再进行下一步。原因是我需要检索 AWT Drawable - 即该画布的本机窗口表面。如果画布不可见,那么该可绘制对象将无效,即使它的标志“可见”设置为 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() 没有帮助。

这样做的问题是,有时,画布在 Init() 到达它需要它可见的地步之前就显示出来了。但其他时候 - 在此之前它不会显示。

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

【问题讨论】:

标签: java canvas awt rendering visible


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-07-13
    • 2014-08-06
    • 2015-06-21
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    相关资源
    最近更新 更多