簡體   English   中英

計時器啟動/停止參數

[英]Timer start/stop parameters

自加入該社區以來,我在技能和進步方面取得了長足發展。 你們都有很大的幫助。 我無法提供一個計時器,該計時器在啟動和停止時已經實現了某些參數。

我或者收到說“本地變量計時器可能尚未初始化”的錯誤消息,或者沒有收到任何錯誤消息,但是什么也沒發生。 也許我把計時器放在錯誤的地方了?

如果我把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();
    }
}

當您要在代碼的不同位置啟動和停止計時器時,應將其設置為成員變量。 這將解決您試圖停止動作監聽器中的計時器的問題。

變量p1Laps在構造函數中不會更改(將其初始化為0后),因此需要在更改plLaps值的地方啟動計時器。 我不確定從另一個線程(Move1)調用timer.start()是否安全。 因此,使用SwingUtilities.invokeLater()啟動計時器可能更安全。

快速解決:

而不是

timer.stop();

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

ActionEvent的getSource方法將返回對調用actioPerformed方法(計時器)的對象的引用,因此該方法可以正常工作。

您的代碼可能還有其他問題,包括沒有Thread.sleep(...)的后台線程,使用KeyListeners而不是Key Binding,在后台線程中添加KeyListener等等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM