Java:我应该如何实现等待以便渲染图像?

时间:2013-07-21 18:46:02

标签: java multithreading swing deadlock awt-eventqueue

我不确定我是否真的正确地问过这个问题......而且我甚至不确定我是否有相关的措辞。所以,我提前道歉......但是我我完全坚持这个问题,并感谢所有的帮助..此外,我坦率地说不是专家所以...请温柔,我不是尝试成为白痴。

所以,坦率地说,我的节目的重点是一个简单的游戏,基于电视上某个有生命线的游戏节目。这个特定的一个是“手机朋友”一个......我有一个引用引用'按钮'(真的是一个JPanel的{​​{1}}。按下此按钮后,我希望它添加,并在MouseListener上绘制JLabelJPanel,无论是绘制动画gif(倒计时)还是锁定其他JFrame直到30秒才发生。作为参考,我目前没有使用Component ......

我试图这样做的方式是:

LayoutManager

我知道我的ImageIcon CountdownImg = new ImageIcon("countdown.gif"); JLabel CountdownLbl = new JLabel(CountdownImg); this.getContentPane().add(CountdownLbl); CountdownLbl.setLocation(200, 200); CountdownLbl.setSize(new Dimension(CountdownImg.getIconWidth(), CountdownImg.getIconHeight())); long startTime = System.currentTimeMillis(); while(System.currentTimeMillis() < startTime + 30000) { ; } 循环存在问题。没有循环,图像渲染成功。有了它,java等待条件满足后才能呈现while。我也尝试使用包含图像的内容窗格创建另一个CountdownLbl,但是(可能是由于我自己的误解或线程不佳......)但框架只是出现并且不呈现其内容。有时在运行它时我注意到有一个JFrame线程,我假设我的非常糟糕的循环可能会干扰这个线程,并且这个线程负责渲染我的图像。

所以我想问题应该是......我怎么能以线程安全的方式真正实现这个?如果这是正确的?

感谢您的时间,耐心和努力。

3 个答案:

答案 0 :(得分:3)

使用SwingWorker在后​​台下载图像。在此example中,单个组件在done()中更新,但您可以在到达时publish()process()张图片。这个相关的example概述了这种方法。

答案 1 :(得分:1)

由于您的问题被标记为AWT,我建议您使用MediaTracker加载图片。有关如何使用它来等待图像加载的详细说明,请参阅文档。

您还可以尝试使用ImageIO.read(URL)来检索BufferedImage

要从网址创建ImageIcon,只需使用构造函数ImageIcon(URL)

答案 2 :(得分:0)

负责绘制图像图标的线程与在你的case中执行while循环的线程相同。有一个名为EDT的事件调度程序线程更新你的swing UI.You使用相同的EDT等待倒数。

您可能需要查看此SwingUtilities.invokeLater()

修改

应该添加更多信息:这里是Using SwingWorker & SwingUtilities