2012-05-10 52 views
2
private void OptionsActionPerformed(java.awt.event.ActionEvent evt) 
{ 
// After clicking on button X, I want 4 other buttons to show up 
// in a sequential order 

ButtonTrue(); 
} 


public void ButtonTrue() 
{ 
    Audio_Options.setVisible(true); 
    letsSleep(); 
    Control_Options.setVisible(true); 
    letsSleep(); 
    Display_Options.setVisible(true); 
    letsSleep(); 
    Network_Options.setVisible(true); 
} 

public void letsSleep() 
{ 
    try { 
     Thread.sleep(10000); 
    } catch (InterruptedException ex) { 
     Logger.getLogger(MainMenu.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

我有4个按钮。我希望它们按顺序排列,如: Button1 - 10秒 - Button2 - 10秒 - Button3 - 10seconds - Button 4Swing:启用延迟按钮

问题:每当我调用函数“ButtonTrue()”时,它们都会一起出现等待30秒。什么会导致这个问题发生?

+0

你从哪里调用ButtonTrue? –

+0

private void OptionsActionPerformed(java.awt.event.ActionEvent evt)// TODO在这里添加处理代码: ButtonTrue(); } 当单击另一个按钮时,将调用ButtonTrue()以启用这4个按钮。 – Encinaar

回答

5
+0

我会让它更通用,永远不要在EDT上使用'Thread.sleep'。也许一个额外的链接到[Swing并发教程](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/) – Robin

0

你应该使用不同的线程这样的:

javax.swing.Timer timer = new Timer(10000, new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
    //...Update the progress bar... 
     Control_Options.setVisible(true); 

     timer.stop(); 

    }  
}); 
timer.start(); 

你的按钮必须最后是在匿名ActionListener的范围内。

0

我认为问题是所有的setVisble调用都在一个线程内,而不是EventDispatchThread。你可以尝试拨打电话:

if(EventQueue.isDispatchThread()) { 
    ButtonTrue(); 
} else { 
    EventQueue.invokeAndWait(new Runnable() { 
     ButtonTrue(); 
    }); 
} 
+0

我试过你的方法,但仍然没有改变。 – Encinaar

+0

@ user1183220是的,我猜这是不对的。我编辑了我的帖子。也许它现在工作 – sebastian