确保在执行其他操作之前在屏幕上绘制 AWT Canvas

Posted

技术标签:

【中文标题】确保在执行其他操作之前在屏幕上绘制 AWT Canvas【英文标题】:Ensure that AWT Canvas is drawn on-screen before doing something else 【发布时间】: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。 【参考方案1】:

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

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

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

【讨论】:

以上是关于确保在执行其他操作之前在屏幕上绘制 AWT Canvas的主要内容,如果未能解决你的问题,请参考以下文章

无法正确生成 Numpy FFT

在 Java awt 中绘制矩形

为啥在屏幕上绘制图像之前不会出现内存不足的问题?

通过按钮将矩形绘制到画布上

操作系统如何在屏幕上绘制窗口?

JAVA - 无法在 JPanel 上绘制组件(也是 Runnable 和 KeyListener)