我不确定我是否真的正确地问过这个问题......而且我甚至不确定我是否有相关的措辞。所以,我提前道歉......但是我我完全坚持这个问题,并感谢所有的帮助..此外,我坦率地说不是专家所以...请温柔,我不是尝试成为白痴。
所以,坦率地说,我的节目的重点是一个简单的游戏,基于电视上某个有生命线的游戏节目。这个特定的一个是“手机朋友”一个......我有一个引用引用'按钮'(真的是一个JPanel
的{{1}}。按下此按钮后,我希望它添加,并在MouseListener
上绘制JLabel
或JPanel
,无论是绘制动画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
线程,我假设我的非常糟糕的循环可能会干扰这个线程,并且这个线程负责渲染我的图像。
所以我想问题应该是......我怎么能以线程安全的方式真正实现这个?如果这是正确的?
感谢您的时间,耐心和努力。
答案 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