加载图像一次的工作方式与以下步骤相同(代码见帖子结尾):
调整大小将在“没有时间”完成,之后需要一两秒才能显示图像(可能是因为我的计算机速度慢)。 如果我花了一段时间(真实)而不让他等待一段时间,他会疯狂加载,可能永远不会花时间展示任何东西(在所有电脑上不仅仅是我的)。所以我希望他等。网络摄像头没有太多发生,所以每10秒可能是一个很好的间隔。
我的问题的两个部分是:
如何以智能方式让循环等待?在它自己的线程中?只需在循环底部放置Thread.wait(10000);
也会停止显示图片。
如何检查图片是否显示而不仅仅是加载,就像MediaTracker一样?
< / LI> 醇>我知道我实际上并没有问如何解决问题,而是如何实施解决方案,这可能是错误的解决方案。对于这种情况,我也添加了上下文:我想显示来自网络摄像头的图像,我可以通过URL获取JPG,它将在未知的时间间隔内在服务器上重写。这种与网络摄像头的连接可能是聪明的或愚蠢的,但无论如何我都无法改变它。不是我的服务器。我只是想写一个客户来展示图片。
参考代码和Great Justice(在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;
}
答案 0 :(得分:1)
如果您致电Thread.sleep
,当前线程无法同时执行任何操作。因此,如果您从主线程执行此操作(我假设,当您询问是否应使用第二个线程时),GUI无法更新,因此无法重新绘制图像。这就是为什么如果你把睡眠放在循环结束时它会挂起。
第二件事是repaint
没有立即重绘。它只是在AWT事件循环中发布一个事件,最终将被处理,然后才重新绘制该组件。
最简单的方法是这样的:
创建第二个加载图像的线程,然后存储在成员变量中。之后它调用repaint
,然后睡觉
在绘画方法中,您可以拍摄图像并在屏幕上绘制。这将发生在主GUI线程中,因此其他线程的睡眠不会受到伤害。
答案 1 :(得分:0)
我试着回答第一个问题:
尝试使用计时器,当计时器到期时,您可以刷新显示