![](/img/trans.png)
[英]How to pause execution of a program until a button is clicked in Java Swing
[英]Trying to pause program execution within an if statement (Swing)
我试图暂停我的程序,并一直在考虑使用Thread.Sleep()。 在了解了这些问题之后,我正在尝试实现一个Swing Timer。 但是,似乎Swing计时器会触发ActionEvents ...我只是想暂停程序执行,并在以下两者之间进行JLabel更改
mPlayerLastRollLabel.setText("Player rolled: ...");
//PAUSE
mPlayerLastRollLabel.setText("Player rolled: " + mFaceNumber);
在以下情况下,我将如何使用Timer来暂停我标记过的程序:
class ClickListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
if (mPlayerTurn && event.getSource() == playerRollButton) {
mFaceNumber = rollDie();
mPlayerLastRollLabel.setText("Player rolled: ...");
**// want to pause here //**
mPlayerLastRollLabel.setText("Player rolled: " + mFaceNumber);
if (mFaceNumber != 1) {
mSubTotal += mFaceNumber;
mPlayerSubtotalLabel.setText("Player's current subtotal: " + mSubTotal);
}
else {
mSubTotal = 0;
mPlayerSubtotalLabel.setText("Player's current subtotal: " + mSubTotal);
mPlayerTurn = false;
mComputerTurn = true;
}
}
if (mPlayerTurn && event.getSource() == playerEndTurnButton) {
mPlayerTotalScore += mSubTotal;
mPlayerCurrentTotalScoreLabel.setText("Player's current total score: " + mPlayerTotalScore);
mSubTotal = 0;
System.out.println(mPlayerTotalScore);
mPlayerTurn = false;
mComputerTurn = true;
}
if (mComputerTurn && event.getSource() == computerRollButton) {
mFaceNumber = rollDie();
mComputerLastRollLabel.setText("Computer rolled: " + mFaceNumber);
if (mFaceNumber != 1)
mSubTotal += mFaceNumber;
else {
mSubTotal = 0;
mPlayerTurn = true;
mComputerTurn = false;
}
}
if (mComputerTurn && event.getSource() == computerEndTurnButton) {
mComputerTotalScore += mSubTotal;
mSubTotal = 0;
System.out.println(mComputerTotalScore);
mPlayerTurn = true;
mComputerTurn = false;
}
}
}
那是因为摆动计时器是异步的。 因此,您必须将代码的第二行(以及所有以下逻辑)放入动作侦听器中,例如:
mPlayerLastRollLabel.setText("Player rolled: ...");
Timer t = new Timer(5000, new ActionListener(){
public void actionPerformed(ActionEvent ae){
mPlayerLastRollLabel.setText("Player rolled: " + mFaceNumber);
}
});
t.setRepeats(false);
t.start();
或者,您可以将睡眠后的下半部分放到单独的函数中,然后从actionPerfomed方法中调用它。 以这种方式而不是Thread.sleep来释放图形线程(这是所有UI的一个),直到睡眠时间到了。 如果不释放图形线程,那么您的用户界面将冻结,因为没有线程可对用户操作做出反应。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.