2012-05-11 38 views
6

我有一個我在Java中製作的21點遊戲,我想通過單擊按鈕來指示遊戲的開始。我所有的動作偵聽器都能正常工作,但問題在於,我無法確定如何在actionPerformed方法內完全運行的情況下啓動遊戲。很明顯,在actionPerformed方法中持續運行的函數將會有效地禁用我的GUI的其餘部分。這裏的一個代碼片段....從動作監聽器中開始遊戲

go.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
       // START GAME SOMEHOW but must run outside of action listener 
     } 
    }); 
+0

遊戲開始時做什麼?它不應該有一個循環。所有的用戶操作都應該是事件。 –

+0

我認爲一個好的解決方案可能是不開始整個遊戲,而只是把卡交出來並返回。但是,我想知道如何從動作偵聽器中啓動程序。我會想象這是可能的,但我對Java和新的計算機完全是新的。任何提示將非常感謝! :) –

+0

感謝您的重播,JB。最初我讓它初始化一個新遊戲,它在構造函數中運行整個事件,所以actionPerformed方法只是簡單地說:「game g = new game()」 但是,現在你提到它應該是一個事件只有我更確定我是在做錯誤的方式。 haha –

回答

1

你的遊戲或許應該開始在自己的線程和管理本身(很難說),而是讓你去,你可以開始你的遊戲在一個新的「外部」線程,這樣的事情在你的actionPerformed:

public void actionPerformed(ActionEvent e) { 
    Thread thread = new Thread("Game thread") { 
     public void run() { 
      startGame(); //or however you start your game 
     } 
    }; 
    thread.start(); 
} 
+0

除非這是一個「幀/秒」驅動/連續動畫應用程序,否則我會說啓動一個單獨的線程來運行遊戲似乎是一個壞主意。 actionPerfomed應該調整用戶界面,返回並等待進一步的用戶操作。 – aioobe

+0

那麼這就是我認爲遊戲運行沒有迴歸的原因,沒有聽起來非常事件驅動給我。 –

7

顯然,actionPerformed方法內連續運行的功能將有效地禁用我的GUI的其餘部分。

這是一個有效的觀察結果,表明您瞭解使用Swing時的基本規則。

你的遊戲很可能是事件驅動的(糾正我,如果我錯了),所以按鈕執行的操作應該只是將程序設置爲新狀態,等待進一步的事件。這不值得花費時間,通常由EDT直接完成。當然,如果你想做一個奇特的開始 - 新遊戲動畫,需要在一個單獨的線程中執行,在這種情況下,你只需啓動動畫線程(儘管我會推薦使用SwingWorker)在actionPerformed方法內,然後返回。

在代碼中,我想這將是這個樣子:

go.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 

     // Remove the menu components 
     someJPanel.removeAll(); 

     // Show the game table 
     someJPanel.add(new GamePanel()); 

     someJPanel.revalidate(); 
     someJPanel.repaint(); 

     // done. Wait for further user actions. 
    } 
}); 
+0

我覺得這聽起來很像我應該做的。我要實現這一點,看看它需要我。我很驚訝,我得到如此之多的迴應如此之快。我非常感謝大家的幫助! –

+1

是的,歡迎來到stackoverflow :-) – aioobe

1

我相信你想擴展javax.swing.SwingWorker

非UI啓動功能將在doInBackground中運行,並且done方法將在完成更新UI時調用。

在javadoc類描述中甚至有一個例子用於更新進度條,並顯示啓動過程中發生的情況。