2014-01-16 32 views
0

我正在编写一个游戏,其中一个图像与另一个图像发生更改,我希望第二个图像在200ms后被移除,这是我真正可以使用的一些帮助。在图像上设置延迟,然后将其删除

我还是一个初学者,所有的帮助表示赞赏!回答好像你正在和一个五岁交谈!

public void setVisible(Boolean visible) { 
    ImageIcon ii = new ImageIcon(this.getClass().getResource(explode)); 

    image = ii.getImage(); 

    //this.visible = visible; 
    /*WITH THIS LINE OF CODE THE EXPLODE DOES NOT SHOW AT ALL, 
    I WANT TO MAKE SURE IT SHOWS BUT ONLY FOR 200MS*/ 
} 

在此先感谢!

+0

使用单曲Swing'Timer' .. 1)为了更好的帮助,请发布[MCVE](http://stackoverflow.com/help/mcve)。 2)获取图像的一种方法是通过热链接到[本答案](http://stackoverflow.com/a/19209651/418556)中看到的图像。 –

回答

0

既然你不应该做这些时阻止像EDT Thread.sleep(200)方法,这里是与TimerTimerTask类另一种解决方案:

public void setVisible(boolean visible) { 
    ImageIcon ii = new ImageIcon(this.getClass().getResource(explode)); 

    // show/hide image 
    ii.setVisible(visible); 

    if (visible) { // only hide image, if it's previously set to visible 
     new Timer().schedule(new TimerTask() { 
      public void run() { 
       ii.setVisible(false); 
      } 
     }, 200); // hide it after 200 ms 
    } 
} 

感谢@AndrewThompson您的意见!

+0

不要阻塞EDT(Event Dispatch Thread) - 当发生这种情况时,GUI将“冻结”。而不是调用'Thread.sleep(n)'实现一个Swing'Timer'来重复执行任务,或者一个'SwingWorker'执行长时间运行的任务。有关更多详细信息,请参见[Swing中的并发](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)。 –

+0

感谢您的建议!我确信,有一个更好的方法来做到这一点;) – bobbel

+0

如果您编辑建议的'计时器'的答案(随时适应我的评论),我可以删除一些噪音和增票。 –

1

您可以使用它的预定线程。您可以使用ScheduledExcecutorService

private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); 


public void displayImageFor200Ms(){ 
    ImageIcon ii = new ImageIcon(this.getClass().getResource(explode)); 
    image = ii.getImage(); 

    scheduler.schedule(new Runnable() { 
     public void run() { 
      // remove image now! 
     } 
    }, 200 , TimeUnit.MILLISECONDS); 
} 

不要忘了关闭调度时,你不需要它了(你可以使用一个全球性的,集中调度的所有延迟行动,并关闭它时你的游戏结束了)

相关问题