2017-01-09 59 views
0

我試圖創建遞增x和y座標,通過設定一個計時器在movingGame類,射擊在不同的類一個ActionListener該消息又在原來的運行方法的移動物體類,它運行代碼來增加x和y變量,並且爲了檢查這些值,輸出x和y。但是,x和y不會上升,就好像結果沒有記錄一樣。如果我在打印結果之前增加它們,它是1,表示它從原始值的正確增加。如果在打印完值後增加,它將不會顯示任何值。這裏是我的代碼:Java變量不更新的計時器

movingGame類:

import javax.swing.JFrame; 
import javax.swing.Timer; 

public class movingGame extends JFrame { 

    public int x; 
    public int y; 

    void moving() { 
     Timer timer = new Timer(100,new ActionPerformer()); 
     timer.start(); 
    } 

    public void timeToDraw() { 
     //This is where it is supposed to increment. 
     x++; 
     y++; 
     System.out.println("y: "+y); 
     System.out.println("x: "+x); 
     //If I put x++ and y++ here, it would give a value of 0. 
    }; 

    public static void main(String[] args){ 
     movingGame d = new movingGame(); 
     d.setVisible(true); 
     d.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     d.setSize(1000, 666); 
     d.setExtendedState(MAXIMIZED_BOTH); 
     d.moving(); 
    }; 
} 

的ActionPerformer類:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class ActionPerformer implements ActionListener { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     movingGame m = new movingGame(); 
     m.timeToDraw(); 
    } 
} 

總之我的問題是,在運行方法後,x和y的值保持不變,只在方法內部顯示更改,但僅在特定運行中顯示。感謝您的幫助。

+0

的約定是大寫的Java中的類名的東西。所以在這種情況下,'movingGame'應該是'MovingGame',就像它的'ActionPerformer','ActionListener','ActionEvent','JFrame'等 – Dave

回答

2

您正在actionPerformed()方法中創建一個新的MovingGame。相反,您應該傳遞對您在main方法中創建的遊戲的引用。沿線

public class ActionPerformer implements ActionListener { 
    private movingGame game; 

    public ActionPerformer(movingGame mg) { 
     this.game = mg; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     this.game.timeToDraw(); 
    } 
} 

然後

Timer timer = new Timer(100, new ActionPerformer(this)); 
+1

不要忘了提,你還需要告訴定時器不是「凝結」的調用.... –

+0

@AmirAfghani這是正確的,所以'timer.setCoalesce(假)'會從多個事件排隊被解僱的情況下執行只有一個事件停止計時器。 OP可以在這裏閱讀更多內容:https://docs.oracle.com/javase/7/docs/api/javax/swing/Timer.html#setCoalesce(boolean) – Dave

0

您正在創建一個新的MovingGame對象執行的操作每次。嘗試在actionPerformed方法之外創建對象