2011-04-22 212 views
1

我有这个学校项目,我需要让我的代码隐藏一个按钮,然后睡觉,然后继续,但它永远不要隐藏按钮。隐藏按钮,然后等待2秒后再次显示,点击按钮后

我有一个类是由一个按钮启动的,然后启动另一个应该隐藏按钮的方法,然后在另一个类中启动一个方法,执行一堆完美的事情,然后它在第三堂课中开始第三种方法,第一课应该做的是睡觉,但在隐藏我的按钮之前睡觉,并完全跳过隐藏我的按钮。

这里是代码的一部分(不介意丹麦值/方法名):

public void turncard(final int navn,boolean spiller){ 
    knap.setVisible(false); 
    EqualCheck.storevalue(this,spiller); 
} 

我知道这部分被包围,如果..但是它可以这样调用。

if(spiller){     //tester om det er spilleren der har vendt kort, 
    kort.repaint();    //og hvis det er, så starter den computerens 
    Main.spillet.computertur(); //tur. 
} 

,然后在“computertur”方法开始

public void computertur() { 
    for(int i = 0; i < kortene.size(); i++) { 
     kortene.get(i).knap.setEnabled(false); 
    } 
    try { 
     Thread.sleep(2000); 
    } catch (Exception e) { 
     System.out.println("sleep failed."); 
    } 

我读过有关invokeAndWait命令,它应该是EDT更好:S,但我怎么可以用它来暂停mythread ...甚至更好的问题,为什么它不隐藏按钮? :)我的意思是,在我的脑海里,在任何其他事情都会在它做任何事情之前将其隐藏起来之前,调用setVisible(false) ..为什么不呢?

+1

不应该最后一个示例代码调用setVisible(false)而不是setEnabled(false)吗? setEnable只是禁用了不可点击的按钮,它不会隐藏它。 – Jberg 2011-04-22 17:43:06

+0

设置启用是为了使用户无法在执行cumputertur()时点击按钮,最终撤消setEnable(false).. :) – Kezides 2011-04-22 19:01:09

回答

2

在执行事件调度线程(EDT)上的代码时,永远不要调用Thread.sleep(...)。这会冻结GUI并阻止它重新绘制iteself。

通常,您的代码需要在单独的线程上执行,除了将该按钮设置为不可见的代码之外。请阅读Swing教程Concurrency中的部分以获取更多信息和解决方案。

+0

invokeAndWait()是有用的,但我只是不能看到如何在我的情况下使用它,因为它需要隐藏我的按钮之后才能做的事情。 – Kezides 2011-04-22 18:47:21

+0

您应该可能不使用invokeAndWait()。你应该创建一个新的线程来运行你的任务。当线程启动时,你使用invokeLater(...)来禁用按钮。你使用Thread.sleep()。然后你使用invokeLater来启用按钮。 – camickr 2011-04-23 03:52:22

+0

啊..我看..我会尽力..谢谢.. :) – Kezides 2011-04-23 11:30:15

相关问题