![](/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.