簡體   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