繁体   English   中英

尝试在if语句中暂停程序执行(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM