簡體   English   中英

單擊時 JButton 卡住(因為我在 ActionListener 中啟動遞歸函數)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM