2009-09-13 25 views
2

我有一個類(模擬)創建另一個類(GUI)的實例。在類GUI中有一個按鈕(開始),它附有一個actionlistener。在一個類中使用ActionListener在另一個類中啓動一個計時器

我需要這個actionlistener來啓動一個計時器模擬,但我不知道如何去做。

代碼在類模擬:

public class Simulation{ 

private static JFrame frame; 
private static GUI control; 
public static Integer xcontrol = 100, ycontrol = 100; 

public Timer timer; 
public int steps; 

public static void main(String[] args) { 
    Simulation sim = new Simulation(); 

} 

public Simulation() { 

frame = new JFrame("Action Listener Test"); 
frame.setLayout(new BorderLayout(1,0)); 

control = new GUI (xcontrol, ycontrol); 
frame.getContentPane().add(control , BorderLayout.CENTER); 

frame.setResizable(false); 
frame.pack(); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.setVisible(true); 
} 


public void StartTimer() { 
    timer.start(); 
    System.out.println("It worked!"); 
} 

代碼在GUI類:

 panel1.add(button1a); 

      button1a.addActionListener(new ActionListener() { 
       public void actionPerformed (ActionEvent event) { 
        Simulation.StartTimer(); 
        } 
       }); 

錯誤的Eclipse告訴我有,是對 「Simulation.timer.start();」 :

無法對類型爲Simulation的非靜態方法StartTimer()進行靜態引用。

但是該方法startTimer所()不能是靜態的,因爲這似乎打破計時器...

任何幫助將是非常讚賞。

+0

的actionPerformed如何獲取SIM – iny 2009-09-13 15:41:22

+0

對不起,我不小心貼f部分的代碼不正確,現在的actionPerformed讀取: Simulation.StartTimer(); – Myles 2009-09-13 15:47:42

回答

0

通過this作爲GUI構造函數的參數。

通常最好避免這種循環引用。 GUISimulator都相互依賴。解決方案的實質是將GUI從有趣的領域特定行爲中分離出來。

(順便說一句:我會強烈避免使用靜態變量不是常量其他任何此外,還要避免非私有的實例變量,但點不延長JFrame。!)

有一些可怕的樣板,你應該加入防止多線程。

public static void main(final String[] args) { 
    java.awt.EventQueue.invokeLater(new Runnable() { public void run() { 
       Simulation sim = new Simulation(); 
    }}); 
} 
+0

我很抱歉,我在發佈的代碼中犯了一個錯誤,「主要構造函數」實際上是一個「模擬」教師,因爲這種模擬本身就是一個「模擬」對象,所以它不能作爲GUI構造函數的參數不要以爲... – Myles 2009-09-13 15:50:30

0

我會怎麼做,是有你的GUI類通過getButton()方法暴露按鈕,然後創建GUI對象後,你的模擬類可以在其自己的ActionListener添加到按鈕,例如?control.getButton()addActionListener方法(新的ActionListener()...等

相關問題