Таймер занимает много времени, чтобы начать - PullRequest
0 голосов
/ 12 февраля 2020

В качестве тестового проекта я пытаюсь написать программу, которая вычисляет мой CPS.

Чтобы достичь этого, я использую Timer, запланированный с фиксированной скоростью, для подсчета заданного времени в этом примере десять затем время отображается на JProgressBar, в то время как пользователь пытается нажимать кнопку как можно чаще.

Но когда я запускаю таймер с помощью кнопки, это занимает около 10 секунд для таймера чтобы начать и заполнить бар.

Может быть, это только потому, что мой компьютер работает медленно?

Код

import javax.swing.*;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Timer;
import java.util.TimerTask;


public class MCPS {
    JFrame frame;
    JProgressBar timeProgress;
    int stateTimeProgress;
    JButton button;
    Container pane;
    boolean inGame;
    int amountClicked;
    boolean isMeasured;
    int duration;
    java.util.Timer timer;

    public MCPS(int time){
        stateTimeProgress = 0;
        duration = time;
        frame = new JFrame("CPS");
        initLogic();
        initFrame();
        initProgressBar(duration);
        initButton();
        pane = new Container();
        pane.setLayout(new FlowLayout());

        init();
    }

    private void initProgressBar(int time) {
        timeProgress = new JProgressBar(0, time);
        timeProgress.setValue(0);

    }


    private void initLogic() {
        inGame = false;
        amountClicked = 0;
        isMeasured = false;
    }

    private void startTimer(int time) {
        timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                stateTimeProgress++;
                timeProgress.setValue(stateTimeProgress);
                if(stateTimeProgress == time){
                    timer.cancel();
                    stopGame();
                }
            }
        }, time*1000, 1000);
    }

    private void stopGame() {
        inGame = false;
    }

    private boolean isInGame() {
        return inGame;
    }

    private void initButton() {
        button = new JButton("Start");
        button.addMouseListener(new MouseListener() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if(isInGame()){
                    amountClicked++;
                }
                else{
                    if(isMeasured == false) {
                        button.setText("Click me!");
                        startGame();
                    }
                }
            }
            @Override
            public void mousePressed(MouseEvent e) {}
            @Override
            public void mouseReleased(MouseEvent e) {}
            @Override
            public void mouseEntered(MouseEvent e) {}
            @Override
            public void mouseExited(MouseEvent e) {}
        });
    }

    private void startGame() {
        inGame = true;
        isMeasured = true;
        startTimer(duration);
    }

    private void initFrame() {
        frame.setResizable(true);
        frame.setSize(350, 150);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
    }

    private void init() {
        pane.add(button);
        pane.add(timeProgress);

        frame.add(pane);
        frame.setVisible(true);
    }
}

Ответы [ 2 ]

0 голосов
/ 12 февраля 2020

Проверьте документацию :

publi c void scheduleAtFixedRate (задача TimerTask, дата firstTime, длительный период)

Параметры:

task - задача, которая будет запланирована.

firstTime - Первый раз, когда задача должна быть выполнена.

period - время в миллисекундах между последовательными выполнениями задачи.

Вы писали:

    timer.scheduleAtFixedRate(new TimerTask()..., time*1000, 1000);

Это означает, что он задержит первый запуск на time*1000 мс

Чтобы сразу запустить выполнение, просто измените код на

    timer.scheduleAtFixedRate(new TimerTask()..., 0, 1000);

Затем, если вы хотите завершить таймер через X секунд, есть некоторые решения для SO:

0 голосов
/ 12 февраля 2020

https://docs.oracle.com/javase/7/docs/api/java/util/Timer.html#scheduleAtFixedRate (java .util.TimerTask,% 20long,% 20long)

publi c void scheduleAtFixedRate (задача TimerTask, длинная задержка, длинная period)

Планирует указанное задание для повторного выполнения с фиксированной скоростью, начиная с указанной задержки. Последующие исполнения выполняются примерно через регулярные интервалы, разделенные указанным периодом.

Второй указанный вами параметр - это задержка перед запуском таймера. Вместо этого установите 0, чтобы сразу начать

...