Параметры запуска / остановки таймера - PullRequest
2 голосов
/ 30 сентября 2011

С тех пор, как я присоединился к этому сообществу, я сделал все возможное в навыках и прогрессе Вы все огромная помощь. У меня проблемы с предоставлением таймера, для которого я реализовал определенные параметры, когда он запускается и останавливается.

Я либо получаю сообщение об ошибке "таймер локальной переменной не инициализирован", либо я не получаю ошибок, но ничего не происходит. Может у меня таймер не в том месте?

Если я добавлю timer.start(); в конструктор, тоже все будет нормально, но тогда таймер должен запуститься при инициализации программы. Мне бы очень хотелось, чтобы таймер не запускался, пока не будет достигнут определенный параметр. Скажем, например, до int p1Laps=1;, но если я помещу timer.start(); в оператор if в конструкторе (т.е. if(p1Laps>=1) { timer.start(); }, таймер никогда не запустится.

Я пытался разместить timer.start(); в разных местах и ​​либо не получил ответа, либо выдал ошибку об отсутствии локальной переменной timer.

Вторая, в некоторой степени связанная проблема, с которой я столкнулся, заключается в невозможности установки каких-либо параметров для вызова timer.stop(); без получения вышеупомянутой ошибки «таймер локальной переменной не мог быть инициализирован». Я оставил timer.stop(); там, где я думаю, что он должен быть в коде, но он получает эту ошибку.

Короче говоря, я хочу, чтобы таймер мог запускаться при достижении параметра, а именно, когда игрок завершил круг. И я хочу, чтобы таймер мог остановиться, когда он достигнет значения.

Заранее спасибо за отличный совет, который я обязательно получу. Примечание: это не весь код, а просто соответствующая информация.

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.awt.geom.*;

public class RacerDoom extends JFrame {
    int counter = 0;
    int p1Laps = 0;
public RacerDoom() {
        //create JFrame
        super("Racer Doom Squared");
        setSize(WIDTH,HEIGHT);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        //set up Timer
        final Timer timer=new Timer(1000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(counter>=10) {
                    timer.stop(); //error here reads "local variable timer may
                                    //not have been initialized"
                }
                else{
                   counter++;
                   }
                System.out.println(counter);
            }
        });
        //inner class threads
        Move1 m1 = new Move1();
        m1.start();
        //start timer
        if(p1Laps>=1) {
            timer.start(); //error here is that timer will not start when
                            //p1Laps>=1
        }
    }
    private class Move1 extends Thread implements KeyListener {
        public void run() {
            addKeyListener(this);
            while(true) {
                try {
                    repaint();
                    //collisions
                    if(p1.intersects(finishtop)&&p1Direction==UP&&p1cross!=true){
                        p1cross=true;
                        p1Laps++;
                        p1Boost++;
                        counter=0;
                        System.out.println(p1Laps);
                    }
                    if(p1.intersects(finishtop)==false) {
                        p1cross=false;
                    }
    public static void main (String [] args) {

        new RacerDoom();
    }
}

Ответы [ 2 ]

4 голосов
/ 30 сентября 2011

Поскольку вы хотите запускать и останавливать таймер в разных местах кода, вы должны сделать его переменной-членом. Это исправит проблему, когда вы пытаетесь остановить таймер внутри слушателя действия.

Переменная p1Laps не изменится в конструкторе (после того, как вы инициализировали ее в 0), поэтому вам нужно запустить таймер, где вы измените значение plLaps. Я не уверен, безопасно ли вызывать timer.start () из другого потока (Move1). Поэтому может быть безопаснее запустить таймер с помощью SwingUtilities.invokeLater ().

1 голос
/ 30 сентября 2011

Быстрое исправление:

Вместо

timer.stop();

Do

((Timer)e.getSource()).stop();

Метод getSource в ActionEvent возвращает ссылку на объект, который вызывает метод actioPerformed (таймер), поэтому это должно работать.

Могут быть и другие проблемы с вашим кодом, включая фоновый поток без Thread.sleep (...), использование KeyListeners вместо Key Binding, добавлениеKeyListener в фоновом потоке, ...

...