2013-07-21 83 views
-1

我不确定我是否真的正确地提出了问题......而且我甚至不确定我是否相关表达了这个问题。所以,我提前道歉......但我是相当卡住在这个问题上,并感谢所有帮助..此外,我坦率地说不是一个专家,所以...请温柔,我不是试图是一个白痴。Java:我应该如何实现等待,以便图像呈现?

因此,坦率地说,我的程序的重点是一个简单的游戏,它基于电视上的某个游戏节目,它具有生命线。这个具体的一个是“电话一个朋友”...我有一个报价'按钮'(真的JPanelMouseListener)。按下此按钮后,我希望它添加,并将JLabelJPanel绘制到JFrame上,无论是绘制动画gif(倒计时)还是锁定其他Component s直到发生30秒。对于参考,我不使用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) { 
    ; 
} 

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

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

谢谢你的时间,耐心和努力。

+2

1)请学习常见的[Java命名约定](http://java.sun.com/docs/books/jls/second_edition/html/names.doc.html#73307)(具体用于名称的情况)类,方法和属性名称并一致使用它们。 2)为了更快地获得更好的帮助,请发布[SSCCE](http://sscce.org/)。 3)不要阻塞EDT(Event Dispatch Thread) - 当发生这种情况时,GUI将“冻结”。而不是调用'Thread.sleep(n)'实现一个Swing'Timer'来重复执行任务,或者一个'SwingWorker'执行长时间运行的任务。请参阅[并发在Swing](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)。 –

+0

*“也尝试创建另一个'JFrame'”*请参阅[使用多个JFrames,好/坏实践?](http://stackoverflow.com/a/9554657/418556) –

回答

0

负责绘制图像图标的线程与正在执行while循环的线程相同。有一种称为EDT的事件调度程序线程,它更新了您的挥杆UI。您正在使用相同的EDT等待倒计时。

你可能想看看这个SwingUtilities.invokeLater()

编辑:

应该补充更多信息:这里是,Using SwingWorker & SwingUtilities

+1

如何使用'SwingUtilitis.invokeLater()'帮助? –

+0

所以我应该首先将'Component'添加到我的内容窗格中,并将计时器放入由'SwingUtilitis.invokeLater()'创建的新'Thread'中? 非常感谢 – user99672

+0

@ user99672:在你走错了路之前,请明白,虽然Tito肯定意味着很好,但''SwingUtilitis.invokeLater()'不*创建一个新的线程,当然不会创建一个线程背景来自Swing事件线程。换句话说,**不要**用它来创建后台线程,而是使用SwingWorker。它可以用在已经创建的后台线程的*里面,以便将代码放到Swing事件线程上,但是这只有在你已经在后台线程中工作时才有用,而且你还没有。 –

1

由于你被问题标记为AWT,我建议你使用MediaTracker加载你的图像。有关如何使用它来等待图像加载完成的详细说明,请参阅文档。您可以尝试使用ImageIO.read(URL)来检索BufferedImage

要从URL创建ImageIcon,只需使用构造函数ImageIcon(URL)即可。

+0

@AndrewThompson - 是的,我注意到。这个问题被标记为AWT,但是(并不是Swing)。 –

+0

我的错误。固定。 – user99672

3

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