2013-06-04 24 views
1

經過一番閱讀後,我回來試圖讓這些圖紙移動。我遇到困難的是計時器從未開始 - 當我嘗試運行initGame方法時,它告訴我我無法從靜態上下文中引用它。如果不是主循環,那麼我從哪裏開始呢?我已經能夠使它在drawComponent中開始,但是這只是在每次繪製時創建一個新的計時器,這是不好的。如何從靜態上下文初始化重繪計時器?

主要類:

public class Test2 extends JFrame { 

    private JPanel paintPanel; 
    public Test2() { 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setMinimumSize(new Dimension(800, 600)); 
     paintPanel = new PaintPanel(); 
     getContentPane().add(paintPanel, BorderLayout.CENTER); 
     pack(); 
    } 
    class PaintPanel extends JPanel implements ActionListener { 
     private List<Shape> gladiators; 
     private Shape mouseOverShape=null; 
     private Timer timer; 

     public void initGame() { 

      timer = new Timer(50, this); 
      timer.start(); 

     }  
     @Override 
     public void actionPerformed(ActionEvent e) { 
      repaint(); 
         // change object location here 
      System.out.println("Repainting"); 
     } 

      public PaintPanel(){ 
      super(); 

      // Create my Gladiator objects and add them here? 

     } 

     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2 = (Graphics2D)g; 
      for (Shape s : gladiators){ 
       g2.draw(s); 
      } 
     } 
    } 
    public static void main(String args[]) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       Test2 gamePanel = new Test2(); 
       gamePanel.setVisible(true); 
       PaintPanel.initGame(); 
      } 
     }); 
    } 
} 

角鬥士類:

public class Gladiator implements Drawable{ 


     int[] location = new int[] {25,25}; 

     public void Draw(Graphics g){ 
       // draw out the shapes which constitute each "gladiator" 
    } 

} 

我還包括了一些報價線說明,我認爲其他的動作去。我很感謝任何有關這些或其他概念的重大問題的反饋意見。謝謝大家!

編輯:

繼鰻魚建議氣墊船全讓我感動的方法的聲明從主要方法爲Test2的方法裏面裏面......我也改變了一個大寫錯誤。它現在看起來像這樣:

public Test2() { 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    setMinimumSize(new Dimension(800, 600)); 
    paintPanel = new PaintPanel(); 
    getContentPane().add(paintPanel, BorderLayout.CENTER); 
    pack(); 

    paintPanel.initGame(); 
} 

主要方法是相同的,減去「PaintPanel.initGame();」。

我得到一個無法找到initGame的符號錯誤。

第2編輯:

我想我的問題得到了回答。如果我仍然有疑問或者稍微回答一下,我會再做一次編輯。謝謝,氣墊船!

回答

3

你在哪裏打電話initGame()?由於定時器是以這種方式啓動的,所以如果你永遠不會調用它,定時器永遠不會啓動。

關於:

,當我嘗試運行它告訴我initGame方法我不能從靜態上下文

您需要向我們展示了這樣的嘗試引用它。通常這意味着你正在嘗試調用類上的方法而不是實例上的方法。

public Test2() { 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    setMinimumSize(new Dimension(800, 600)); 
    paintPanel = new PaintPanel(); 
    getContentPane().add(paintPanel, BorderLayout.CENTER); 
    pack(); 

    paintPanel.initGame(); 
} 

編輯

幽州:

PaintPanel.initGame(); 

你不能做到這一點。您不能在類上調用非靜態方法,就好像它是靜態方法。相反,它必須在上面顯示的實例上調用。所以這個問題的答案,

如何從靜態上下文初始化重繪計時器?

難道你不知道。您從靜態上下文初始化它。

請注意,您不應將paintPanel變量聲明爲JPanel,因爲您需要調用initGame()方法,該方法不是JPanel的方法。相反,將其聲明爲PaintPanel變量。


編輯2

有關:

,我收到了找不到符號錯誤引用initGame。

請重新閱讀本編輯上方的最後一段。

+0

我在主要方法中調用它。爲了清楚起見,我將添加它。 –

+0

@PeterF:查看編輯 –

+0

好吧,我現在得到你在說的內容 –