6

Java で作成したブラックジャック ゲームがあり、ボタンをクリックしてゲームの開始を知らせたいと考えています。すべてのアクション リスナーは問題なく動作しますが、問題は、actionPerformed メソッド内で完全に実行されていないと、ゲームを開始する方法がわからないことです。明らかに、actionPerformed メソッド内で継続的に実行されている関数は、GUI の残りの部分を効果的に無効にします。ここにコードスニペットがあります....

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

3 に答える 3

7

明らかに、actionPerformed メソッド内で継続的に実行されている関数は、GUI の残りの部分を効果的に無効にします。

これは有効な観察であり、Swing を操作する際の基本的なルールを理解していることを示しています。

あなたのゲームはイベント ドリブンである可能性が最も高いため (間違っていたら訂正してください)、ボタンによって実行されるアクションは、プログラムを新しい状態に設定し、さらなるイベントを待機する必要があります。これは時間のかかるものではなく、通常は EDT によって直接行われます。

もちろん、派手な新しいゲーム開始アニメーションを実行したい場合は、別のスレッドで実行する必要があります。その場合は、actionPerformed メソッド内からアニメーション スレッドを開始するだけです (ただし、SwingWorker を使用することをお勧めします)。 、そして戻る。

コードでは、次のようになると思います。

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.
    }
});
于 2012-05-11T20:41:46.077 に答える
1

javax.swing.SwingWorkerを拡張したいと考えています。

UI 以外の起動機能はdoInBackgroundで実行され、UI の更新が完了するとdoneメソッドが呼び出されます。

javadoc Class Description には、起動時に何が起こっているかのステータスでプログレスバーを更新する例さえあります。

于 2012-05-11T21:02:15.233 に答える
1

ゲームはおそらく独自のスレッドで開始し、それ自体を管理する必要がありますが (言うのは難しいです)、新しい「外部」スレッドでゲームを開始することができます。

public void actionPerformed(ActionEvent e) {
    Thread thread = new Thread("Game thread") {
        public void run() {
            startGame(); //or however you start your game
        }
    };
    thread.start();
}
于 2012-05-11T20:29:00.267 に答える