【发布时间】:2011-03-23 23:12:47
【问题描述】:
按以下步骤加载图像一次(代码见帖子末尾):
- 加载 URI
- 使用 Toolkit 从 URI 加载图像
- 使用 MediaTracker 检查加载(waitForAll())
- 根据图像更改视口大小
- (repaint() 在这里尝试过,没有改变任何东西)
调整大小将“立即”完成,然后需要一两秒钟才能实际显示图像(可能是因为我的计算机速度慢)。 如果我在不让他等待一段时间的情况下放一段时间(真的),他会像疯了一样加载,可能永远不会花时间展示任何东西(在所有计算机上,而不仅仅是我的)。所以我想让他等。网络摄像头没有发生太多事情,因此每 10 秒可能是一个不错的间隔。
我的问题的两个部分是:
如何让循环以一种智能的方式等待?在它自己的线程中?只需将
Thread.wait(10000);放在循环底部也会停止显示图片。-
如何检查图片是否显示,而不是像 MediaTracker 那样加载?
我知道我实际上不是问如何解决问题,而是问如何实施解决方案,这可能一开始就错了。对于这种情况,我也添加了上下文:我想显示来自网络摄像头的图像,我可以通过 URL 以 JPG 格式获取这些图像,该 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;
}
【问题讨论】: