2011-07-29 26 views
3

所以在这一块的代码:如何在Java中延迟MessageDialogBox?

//Actions performed when an event occurs. 
    public void actionPerformed(ActionEvent event) 
    { 
     String command = event.getActionCommand(); 

     //If btnConvertDocuments is clicked, the FileConverter method is called and the button is then disabled [so as to prevent duplicates]. 
     if (command.equals("w")) 
     { 
      new Thread(new Runnable() 
      { 
       public void run() 
       { 
        FileConverter fc = new FileConverter(); 

       } 
      }).start(); 
      btnConvertDocuments.setEnabled(false); 
      //Validation message ensuring completion of the step. 
      JOptionPane.showMessageDialog(this, "Step 1 Complete!", "Validation", JOptionPane.INFORMATION_MESSAGE); 
     } 

好像在消息对话框弹出太快了,甚至没有完被调用FileConverter方法之前。我想知道JOptionPane的位置是否正确,或者在方法完成处理之前是否有延迟消息的方法?

回答

5

可以使用SwingWorker

看看这里,java tutorial

SwingWorker worker = new SwingWorker<Void, Void>() { 
    @Override 
    public Void doInBackground() { 
     FileConverter fc = new FileConverter(); 
     return null; 
    } 

    @Override 
    public void done() { 
     JOptionPane.showMessageDialog(this, "Step 1 Complete!", "Validation", JOptionPane.INFORMATION_MESSAGE); 
    } 
}; 
+0

SwingWorker不是Swing的预建类吗?当我尝试在eclipse中使用它时,它给了我一个编译器错误,指出SwingWorker无法解析为类型。 –

+0

它自Java 6以来已包含在Swing中。 – perp

+0

是的,我有最新版本,但仍无法导入SwingWorker。 –

3

您应该延迟使用Swing Timer,而不是为此使用自己的Thread和Runnable。

您可以通过两种方式使用Swing定时器:

  • 执行一次任务,延迟一段时间后。 例如,工具提示管理器使用Swing计时器来确定何时显示工具提示以及何时隐藏它。
  • 重复执行任务。 例如,您可以执行动画或更新显示朝向目标进展的组件。

从文档的一个例子:

int delay = 1000; //milliseconds 
    ActionListener taskPerformer = new ActionListener() { 
     public void actionPerformed(ActionEvent evt) { 
      //...Perform a task... 
     } 
    }; 
    Timer myTimer = new Timer(delay, taskPerformer); 
    myTimer.setRepeats(false); 
    myTimer.start(); 
+0

这是个不错的方法,只是不正是我所需要的时间的长短才能完成FileConverter是高度可变的,因此预先定义定时器不会对我来说是最好的选择。但是,谢谢你。 –