【发布时间】: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 不能保证它确实是!
【问题讨论】:
-
“这很奇怪,因为元素的绘制和渲染应该由一个完全独立的线程处理” 应该,可以.. 但它们是吗?似乎 EDT 正在这里睡觉。为了尽快获得更好的帮助,edit 添加minimal reproducible example 或Short, Self Contained, Correct Example。
-
AWT 的具体线程模型是依赖于实现的,过去发生了变化:AWTThreadIssues。
标签: java canvas awt rendering visible