使用AWT在Java中“在成功加载后10秒重新加载图像”

时间:2011-03-23 14:51:32

标签: java awt wait

加载图像一次的工作方式与以下步骤相同(代码见帖子结尾):

  1. 加载URI
  2. 使用Toolkit加载URI中的图像
  3. 使用MediaTracker检查加载(waitForAll())
  4. 根据图像更改视口大小
  5. (repaint()在这里试过,没有改变任何东西)
  6. 调整大小将在“没有时间”完成,之后需要一两秒才能显示图像(可能是因为我的计算机速度慢)。 如果我花了一段时间(真实)而不让他等待一段时间,他会疯狂加载,可能永远不会花时间展示任何东西(在所有电脑上不仅仅是我的)。所以我希望他等。网络摄像头没有太多发生,所以每10秒可能是一个很好的间隔。

    我的问题的两个部分是:

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

    2. 如何检查图片是否显示而不仅仅是加载,就像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;
      }
      

2 个答案:

答案 0 :(得分:1)

如果您致电Thread.sleep,当前线程无法同时执行任何操作。因此,如果您从主线程执行此操作(我假设,当您询问是否应使用第二个线程时),GUI无法更新,因此无法重新绘制图像。这就是为什么如果你把睡眠放在循环结束时它会挂起。

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

最简单的方法是这样的:
创建第二个加载图像的线程,然后存储在成员变量中。之后它调用repaint,然后睡觉 在绘画方法中,您可以拍摄图像并在屏幕上绘制。这将发生在主GUI线程中,因此其他线程的睡眠不会受到伤害。

答案 1 :(得分:0)

我试着回答第一个问题:

尝试使用计时器,当计时器到期时,您可以刷新显示