【问题标题】:Swing: Enabling Buttons With DelaySwing:启用延迟按钮
【发布时间】:2013-12-17 07:39:21
【问题描述】:
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 个按钮。我希望它们按顺序出现,例如: 按钮 1 - 10 秒 - 按钮 2 - 10 秒 - 按钮 3 - 10 秒 - 按钮 4

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

【问题讨论】:

  • 你从哪里调用 ButtonTrue?
  • private void OptionsActionPerformed(java.awt.event.ActionEvent evt) { // TODO 在此处添加您的处理代码:ButtonTrue();单击另一个按钮时,会调用 ButtonTrue() 来启用这 4 个按钮。

标签: java swing delay jbutton


【解决方案1】:

【讨论】:

  • 我会让它更通用,永远不要在 EDT 上使用Thread.sleep。也许还有一个额外的链接到Swing Concurrency tutorial
【解决方案2】:

您应该为此使用不同的线程:

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 的范围内。

【讨论】:

    【解决方案3】:

    我认为问题在于所有 setVisble 调用都在一个线程中,而不是 EventDispatchThread。您可以尝试调用:

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

    【讨论】:

    • @user1183220 是的,我想这不太对。我已经编辑了我的帖子。也许它现在正在工作
    猜你喜欢
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多