在代码执行中添加延迟

时间:2013-12-06 18:51:58

标签: java swing timer loading delay

我花了很多时间研究Thread.sleepTimer函数。基本上我正在写一个抵押贷款计算器,它应该在计算时模拟几秒钟。理想情况下,我想要一条消息显示“正在计算...”,然后它会在一两秒后将结果窗口设置为可见。

Thread.sleep似乎忽略了它在代码中的位置,因此我的setText“计算...”永远不会完成。这就是我Timer带来的。

Timer似乎部分有效,但在计时器完成之前它不会停止运行代码...它会移动到以下行。

有任何帮助吗?附上我的代码块。

ActionListener taskPerformer = new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        //...Perform a task...

        errorPromptLabel.setText("Checking your results! Please wait...");
        errorPromptLabel.setVisible(true);
    }
};

Timer timer = new Timer( 1000 , taskPerformer);
timer.setRepeats(false);
timer.start();

// This code is supposed to run AFTER the timer to show the results

CalculationResults f = new CalculationResults(String.valueOf(loanAmountInt), String.valueOf(loanInterestInt), String.valueOf(loanPeriodInt), String.valueOf(monthlyRepaymentInt), checkMonthlyRepayment, checkLoanPeriod);
this.setVisible(false);
f.setVisible(true);
this.dispose();

1 个答案:

答案 0 :(得分:1)

你想要的是创建一个与你的“计算...”消息模态对话框,然后使用你的计时器取消该对话框并继续处理。

定时器以异步方式运行。

http://docs.oracle.com/javase/7/docs/api/javax/swing/Timer.html

  

虽然所有计时器都使用单个共享线程(由执行的第一个Timer对象创建)执行等待,但Timers的操作事件处理程序在另一个线程上执行 - 事件派发线程。这意味着Timers的动作处理程序可以安全地对Swing组件执行操作。但是,这也意味着处理程序必须快速执行以保持GUI响应。

在你的情况下,你似乎已经扭转了这个过程。 ActionListener应该完成处理“计算...”消息和设置结果的工作,然后在强调>之前设置对话框。

Thread.sleep()在这里使用是错误的。