简体   繁体   English

尝试在if语句中暂停程序执行(Swing)

[英]Trying to pause program execution within an if statement (Swing)

I'm trying to pause my program and have been looking at using Thread.Sleep(). 我试图暂停我的程序,并一直在考虑使用Thread.Sleep()。 After reading about the problems this causes I am trying to implement a Swing Timer. 在了解了这些问题之后,我正在尝试实现一个Swing Timer。 However, it seems that Swing timers fire ActionEvents... I'm only looking to pause program execution and have a JLabel change between the following 但是,似乎Swing计时器会触发ActionEvents ...我只是想暂停程序执行,并在以下两者之间进行JLabel更改

mPlayerLastRollLabel.setText("Player rolled: ...");

//PAUSE

mPlayerLastRollLabel.setText("Player rolled: " + mFaceNumber);

How would I use a Timer in the case below to pause the program where I've marked it: 在以下情况下,我将如何使用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;
            }


        }
    }

That is because swing timer is asynchronous. 那是因为摆动计时器是异步的。 So you have to put second line of your code (and all following logic) into action listener like: 因此,您必须将代码的第二行(以及所有以下逻辑)放入动作侦听器中,例如:

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();

Or you can put second half after sleep into separate function and call it from actionPerfomed method. 或者,您可以将睡眠后的下半部分放到单独的函数中,然后从actionPerfomed方法中调用它。 Doing it this way instead of Thread.sleep you release graphical thread (which is one for all UI) until your sleeping time is up. 以这种方式而不是Thread.sleep来释放图形线程(这是所有UI的一个),直到睡眠时间到了。 If don't release graphical thread then your UI would freeze because there would be no thread to react to user actions. 如果不释放图形线程,那么您的用户界面将冻结,因为没有线程可对用户操作做出反应。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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