gpt4 book ai didi

java - Java 中的 AWT 为 "Reload Image 10 sec after successful loading"

转载 作者:行者123 更新时间:2023-12-01 15:54:13 26 4
gpt4 key购买 nike

按照以下步骤加载一次图像(代码见帖子末尾):

  1. 加载 URI
  2. 使用 Toolkit 从 URI 加载图像
  3. 使用 MediaTracker 检查加载情况(waitForAll())
  4. 根据图像更改视口(viewport)大小
  5. (这里尝试了 repaint(),没有改变任何东西)

调整大小将“立即”完成,之后需要一两秒才能实际显示图像(可能是因为我的计算机速度较慢)。如果我花一段时间(正确的)而不让他等待一段时间,他会疯狂地加载,并且可能永远不会花时间显示任何东西(在所有计算机上,不仅仅是我的)。所以我想让他等一下。网络摄像头上没有发生太多事情,因此每 10 秒可能是一个不错的间隔。

我的问题分为两部分:

  1. 如何以智能方式让循环等待在它自己的线程内?只是放一个Thread.wait(10000);循环底部的 也会停止显示图片。

  2. 如何检查图片是否显示,而不是像 MediaTracker 那样加载

我知道我实际上问的不是如何解决问题,而是如何实现解决方案,这可能一开始就是错误的。对于这种情况,我也添加了上下文:我想显示来自网络摄像头的图像,我可以通过 URL 作为 JPG 获取该图像,该图像将以未知的时间间隔在服务器上重写。这种与网络摄像头的连接可能是聪明的,也可能是愚蠢的,但我无论如何都无法改变它。不是我的服务器。我只是想写一个客户端来显示图片。

供引用和大正义的代码(在actionPerformed()内):

...
// now use an URI even if Toolkit.getImage() uses URL, as
// recommended here:
// http://download.oracle.com/javase/6/docs/api/java/net/URL.html
URI adress = null;
try {
adress = new URI("http://194.95.48.67/record/current.jpg");
} catch (URISyntaxException e1) {
throw new Error(e1);
}
displaystate = STATE_LOADING;
repaint();
System.out.println("load image from: " + adress);
try {
image = getToolkit().getImage(adress.toURL());
} catch (MalformedURLException e1) {
throw new Error(e1);
}
MediaTracker mt = new MediaTracker(this);
mt.addImage(image, 0);
try {
mt.waitForAll();
} catch (InterruptedException e) {
// nothing
}
filename = adress.toString();
imagesize.width = image.getWidth(null);
imagesize.height = image.getHeight(null);
if (imagesize.width == -1 || imagesize.height == -1) {
displaystate = STATE_LOADERROR;
} else {
viewport.x = 0;
viewport.y = 0;
viewport.width = imagesize.width;
viewport.height = imagesize.height;
setSize(viewport.width, viewport.height);
displaystate = STATE_DISPLAYING;
}

最佳答案

如果您调用Thread.sleep,当前线程同时无法执行任何操作。因此,如果您从主线程执行此操作(正如我假设的那样,当您询问是否应该使用第二个线程时),GUI 无法更新,因此无法重新绘制图像。这就是为什么如果您将 sleep 放在循环末尾,它就会挂起。

第二件事是repaint不会立即重新绘制。它只是在 AWT 事件循环中发布一个事件,该事件最终将被处理,然后组件才会被重新绘制。

最简单的方法是这样的:
创建第二个线程来加载图像,然后将其存储在成员变量中。之后它调用repaint,然后 hibernate 。
在绘制方法中,您获取图像并将其绘制在屏幕上。这将发生在主 GUI 线程中,因此其他线程的 sleep 不会造成损害。

关于java - Java 中的 AWT 为 "Reload Image 10 sec after successful loading",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5407082/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com