0

是否javax.swing.Timer timer;足以计算经过的时间?我正在做一个俄罗斯方块项目,它还计算玩家玩游戏所花费的时间。在play方法中,

public void play() {
        reset();
        onPlay = true;
        Thread thread = new Thread(new Game());
        thread.start();
        rightPanel.setPlayButtonEnable(false);
        rightPanel.setPause(true);
        rightPanel.setStop(true);
        playItem.setEnabled(false);
        pauseItem.setEnabled(true);
        stopItem.setEnabled(true);
        setBlockColorItem.setEnabled(false);
        setBGColorItem.setEnabled(false);
        rightPanel.requestFocus();
        //time.start();
        //timeElapsed = System.currentTimeMillis();
        RightPanel.timeElapsedTextField.setText("");
        timer.start();
        startTime = System.currentTimeMillis();
    }


stop方法中,

public void stop() {
        isStop=true;
        onPlay = false;
        if (piece != null) 
            piece.isMoving = false;
        playItem.setEnabled(true);  
        rightPanel.setPlayButtonEnable(true);
        pauseItem.setEnabled(false); 
        rightPanel.setPauseButtonLabel(true);
        stopItem.setEnabled(false);   
        resumeItem.setEnabled(false);
        setBlockColorItem.setEnabled(true);
        setBGColorItem.setEnabled(true);
        rightPanel.setPause(false);
        rightPanel.setStop(false);
        reset();
        //time.stop();
        timer.stop();
        long delta = (System.currentTimeMillis() - startTime)/10;
        RightPanel.timeElapsedTextField.setText(Double.toString(delta/100.0) + " seconds");

    }



这些够吗?每当尝试显示经过的时间时,JTextField 什么都不显示。有什么问题?非常感谢!

public void run() {
            int column = 4, style = Piece.SHAPES[(int) (Math.random() * 7)][(int) (Math.random() * 4)];
            //timer.start();
            //startTime = System.currentTimeMillis();
            while (onPlay) {

                if (piece != null) {
                    if (piece.isAlive()) {
                        try {
                            Thread.currentThread().sleep(100);
                        } 
                        catch (InterruptedException ie) {
                            ie.printStackTrace();
                        }
                        continue;
                    }
                }

                checkFullLine();  
                if (isGameOver()) {
                    playItem.setEnabled(true);
                    pauseItem.setEnabled(true);
                    resumeItem.setEnabled(false);
                    rightPanel.setPlayButtonEnable(true);
                    rightPanel.setPauseButtonLabel(true);

                    displayGameOver();
                    return;
                }
                piece = new Piece(style, -1, column, board);
                piece.start();
                //numDropped = numDropped+1;
                //RightPanel.scoreTextField.setText(numDropped+"");
                style = Piece.SHAPES[(int) (Math.random() * 7)][(int) (Math.random() * 4)];
                rightPanel.setTipStyle(style);
                numDropped = numDropped+1;
                RightPanel.numDroppedTextField.setText(numDropped+"");
                //RightPanel.numDroppedTextField = new JTextField(numDropped+"");
                long startTime = System.currentTimeMillis();
            }
            long estimatedTime = ((System.currentTimeMillis() - startTime)/1000);
            RightPanel.timeElapsedTextField.setText(estimatedTime+"");
        }
4

2 回答 2

2

您应该使用nanoTime()来计算经过的时间。

long startTime = System.nanoTime();
// ... the code being measured ...
long estimatedTime = System.nanoTime() - startTime;

你有一个为游戏运行的线程。我认为您应该在 run() 方法的开始和 run() 方法的估计时间结束时计算 startTime。我只能推测,因为我不知道 Game 类代码。

下面是如何做到这一点的简单说明。

  import java.util.concurrent.TimeUnit;

  public class Demo implements Runnable {

private volatile boolean shouldRun = true;

@Override
public void run() {
    long startTime = System.nanoTime();
    while (shouldRun) {
        // do nothing
    }
    long estimatedTime = System.nanoTime() - startTime;
    System.out.println(TimeUnit.NANOSECONDS.toSeconds(estimatedTime));//Print apprx 5 seconds since time may be required to actually enter in to run method after start
}

public void stop() {
    shouldRun = false;
}

public static void main(String[] args) throws InterruptedException {
    Demo demo = new Demo();
    Thread thread = new Thread(demo);
    thread.start();
    Thread.sleep(5000);// 5 Seconds sleep
    demo.stop();// Stop the thread
}
}
于 2012-10-10T16:18:26.287 回答
0
于 2019-11-29T03:00:28.403 回答