我花了很多时间研究Thread.sleep
和Timer
函数。基本上我正在写一个抵押贷款计算器,它应该在计算时模拟几秒钟。理想情况下,我想要一条消息显示“正在计算...”,然后它会在一两秒后将结果窗口设置为可见。
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();
答案 0 :(得分:1)
你想要的是创建一个与你的“计算...”消息模态对话框,然后使用你的计时器取消该对话框并继续处理。
定时器以异步方式运行。
http://docs.oracle.com/javase/7/docs/api/javax/swing/Timer.html
虽然所有计时器都使用单个共享线程(由执行的第一个Timer对象创建)执行等待,但Timers的操作事件处理程序在另一个线程上执行 - 事件派发线程。这意味着Timers的动作处理程序可以安全地对Swing组件执行操作。但是,这也意味着处理程序必须快速执行以保持GUI响应。
在你的情况下,你似乎已经扭转了这个过程。 ActionListener应该完成处理“计算...”消息和设置结果的工作,然后在>强调>>之前设置对话框。
Thread.sleep()在这里使用是错误的。