![](/img/trans.png)
[英]FlowControl in ActionListener method in Java When JButton Clicked
[英]JButton stuck when clicked (because i start recursive function in ActionListener)
我正在用java做一個棋盤游戲,我想制作一個開始按鈕來開始游戲。 主函數是一個遞歸函數(gameloop),我在 ActionListener 中調用該函數,當我單擊按鈕時它會卡住。
ActionListener startListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
gameFrame.remove(startB);
gameFrame.add(boardPanel, gbc);
gameFrame.revalidate();
Game.gameLoop(); //the main recursive function
}
};
編輯:我使用了 SwingWorker,效果很好,謝謝你的幫助
嘗試這樣的事情:
@Override
public void actionPerformed(ActionEvent e) {
gameFrame.remove(startB);
gameFrame.add(boardPanel, gbc);
gameFrame.revalidate();
new Thread(){
public void run(){
Game.gameLoop(); //the main recursive function
}
}.start();
}
這是一個完全錯誤的設計。
首先: actionPerformed()
應該觸發一些動作,但永遠不要運行游戲循環。 actionPerformed()
應該盡快返回:它並不意味着執行復雜的操作。 理想情況下,將游戲循環放入自己的線程中,並以將動作傳遞給游戲循環然后立即返回的方式實現actionPerformed()
。
第二:游戲循環應該迭代實現,而不是作為遞歸函數。 (這就是為什么它首先被稱為“游戲循環”。)遞歸實現它是沒有意義的,因為游戲循環往往會運行很長時間,並且遞歸概念會消耗越來越多的堆棧內存並且在某些時候會失敗- 通常很快。
我建議對您的軟件進行完全重新設計。 那么你就不會在JButton
遇到任何麻煩。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.