[英]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.