Java 尝试在if语句中暂停程序执行(Swing)
我正在尝试暂停我的程序,并一直在考虑使用Thread.Sleep()。在阅读了关于这导致的问题之后,我正在尝试实现一个Swing计时器。然而,似乎Swing计时器触发了ActionEvents。。。我只想暂停程序执行,并在以下两种情况之间进行JLabel更改Java 尝试在if语句中暂停程序执行(Swing),java,swing,timer,Java,Swing,Timer,我正在尝试暂停我的程序,并一直在考虑使用Thread.Sleep()。在阅读了关于这导致的问题之后,我正在尝试实现一个Swing计时器。然而,似乎Swing计时器触发了ActionEvents。。。我只想暂停程序执行,并在以下两种情况之间进行JLabel更改 mPlayerLastRollLabel.setText("Player rolled: ..."); //PAUSE mPlayerLastRollLabel.setText("Player rolled: " + mFaceNumb
mPlayerLastRollLabel.setText("Player rolled: ...");
//PAUSE
mPlayerLastRollLabel.setText("Player rolled: " + mFaceNumber);
在以下情况下,我将如何使用计时器暂停我标记的程序:
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;
}
}
}
这是因为swing计时器是异步的。因此,您必须将第二行代码(以及以下所有逻辑)放入操作侦听器,如:
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的线程),直到您的睡眠时间结束。如果不释放图形线程,您的UI将冻结,因为没有线程对用户操作作出反应。这是因为swing计时器是异步的。因此,您必须将第二行代码(以及以下所有逻辑)放入操作侦听器,如:
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的线程),直到您的睡眠时间结束。如果不释放图形化线程,您的UI将冻结,因为没有线程对用户操作作出反应。太棒了!你认为我的代码结构可以吗?目前我有一个ActionListener处理来自四个源(所有按钮)的事件。。。这是一个典型的Swing应用程序,还是大多数人会为每个按钮单独设置一个ActionListener@我认为这是品味的问题。就我个人而言,我更喜欢使用匿名ActionListener实现来分离操作代码(正如我在示例中使用的那样)。我将多个动作监听器加入全局监听器的唯一原因是需要对多个不同的事件做出相同的反应。我有一个类似的问题,但如果我不想将程序的其余部分放入actionPerformed语句中。我怎样才能在计时器停止后返回到主摆动线程?即使在actionPerformed中调用了timer.stop(),在主线程中测试timer.isRunnable()也不起作用。太棒了!你认为我的代码结构可以吗?目前我有一个ActionListener处理来自四个源(所有按钮)的事件。。。这是一个典型的Swing应用程序,还是大多数人会为每个按钮单独设置一个ActionListener@我认为这是品味的问题。就我个人而言,我更喜欢使用匿名ActionListener实现来分离操作代码(正如我在示例中使用的那样)。我将多个动作监听器加入全局监听器的唯一原因是需要对多个不同的事件做出相同的反应。我有一个类似的问题,但如果我不想将程序的其余部分放入actionPerformed语句中。我怎样才能在计时器停止后返回到主摆动线程?即使在actionPerformed中调用了timer.stop(),在主线程中测试timer.isRunnable()也不起作用。