-1

我不确定我是否真的正确地提出了这个问题......我什至不确定我是否已经相关地表达了这个问题......所以,我提前道歉......但我很困惑在这个问题上并感谢所有帮助..此外,坦率地说,我不是专家,所以......请温柔一点,我不是成为一个白痴。

所以,坦率地说,我的节目的重点是一个简单的游戏,基于电视上的某个游戏节目,它有生命线。这个特定的游戏是“给朋友打电话”......我有一个关于报价的报价按钮'(真的是一个JPanel有一个MouseListener)。按下此按钮后,我希望它添加并在 上绘制或JLabel,以绘制动画 gif(倒计时)并锁定其他s 直到发生 30 秒。作为参考,我目前没有使用...JPanelJFrameComponentLayoutManager

我一直在尝试这样做的方式是:

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) {
    ;
}

我知道我的while循环存在问题。没有循环,图像可以成功渲染。有了它,java 会等到满足条件后才渲染CountdownLbl。我还尝试JFrame使用具有图像的内容窗格创建另一个,但是(可能再次,由于我自己的误解或线程不良......)但框架只是出现并且不呈现其内容。有时在运行它时我注意到有一个Image Fetcher线程,我假设我的非常糟糕的循环可能会干扰这个线程,并且这个线程负责渲染我的图像。

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

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

4

3 回答 3

3

使用 aSwingWorker在后台下载图像。在此示例中,单个组件在 中更新,done()但您可以在图像到达时对其进行更新。此相关示例概述了该方法。publish()process()

于 2013-07-21T19:53:52.113 回答
1

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

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

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

于 2013-07-21T18:49:51.073 回答
0

在您的情况下,负责绘制图像图标的线程与执行 while 循环的线程相同。有一些称为 EDT 的事件调度程序线程会更新您的 Swing UI。您正在使用相同的 EDT 来等待倒计时。

您可能想查看此SwingUtilities.invokeLater()

编辑:

应该添加更多信息:在这里,使用 SwingWorker 和 SwingUtilities

于 2013-07-21T18:56:38.917 回答