1

私はJavaでマッチングゲームを作っていますが、かなりうまくいっています。問題は、2 枚目のカードをクリックしたときに、それらが同じでない場合、カードが裏返されますが、2 枚目のカードが何であるかが表示されないことです。2 枚のカードが表示された後、プログラムを遅らせることを考えていましたが、うまくいきません。最初のカードだけを表示し、プログラムを遅らせてから、最初に行ったことを実行します。2枚目の画像は表示されません。私は wait() と Thread.sleep(1000) を試しましたが、どれも私が望む効果を生み出しません。

// code above where it finds the first card and shows it
y.setIcon(FindTheCard(es2,'c')); //showing the second card
            try{Thread.sleep(3000L); // delaying
            }catch(Exception e){}

私はスレッドにかなり慣れていないので、最初に実行されるのはスレッドであり、次に残りのコードであると思いますが、これは私が望んでいるものではありません。y.setIcon(..) を実行してから、残りのコードを実行する前に少し遅延させたいと考えています。私のコードに関するすべてが完璧に機能するので、それは私の知識不足によるものだと思います。私が必要とするのは遅延だけです。

ただし、次のコードも試しました。

public class testing {

    public static void main(String[] args) {
        System.out.println("Do this stuff");
        try { Thread.sleep(500); }
        catch ( Exception e ) { }
        System.out.println("Now do everything after this");

    }

}

そしてそれは動作します。2 つの文の間には少し遅れがあります。実際にはボタンであるカードで同じことを行うにはどうすればよいですか。カードが表示された後にカードを元に戻すコードも削除しましたが、カードは同じままです。したがって、2 枚目のカードまたはアイコンに関しては問題ありません。

4

3 に答える 3

1

グラフィックス レンダリング エンジンを作成するには、次の 2 つの方法があります。

  1. マルチスレッド
  2. シングルスレッド

マルチスレッド化を正しく行うのは非常に難しく、間違いを犯しやすく、パフォーマンスの向上は疑わしいものであることがわかりました。

Java の決定は、レンダリング用に単一のスレッドを持つことでした。その結果、イベント処理とメイン ロジックを 1 つのスレッドで実行し、GUI 更新の作業をレンダリング スレッドに送信します。

コード全体を表示することはできませんが、レンダリング スレッドを悪用している可能性が最も高く、3 秒間スリープ状態にすることで、実際には UI が 3 秒間更新されて変更が表示されなくなり、スリープ直後にリセットされます。

レンダリング スレッドの外で UI 更新関数を呼び出すべきではありません。要求をレンダリング スレッドに送信し、必要な時間だけイベント スレッド (または 3 番目のタイマー スレッド) をスリープ状態にする必要があります。

于 2013-01-20T14:46:42.853 に答える
0

sleepGUI コード (イベント ディスパッチ スレッドで実行されるコード) では使用しないでください。代わりTimerに、遅延後にアクションを実行する Swing をスケジュールします。基本的に、 current の後のすべてのコードをSwing に関連sleepするメソッドにコピー アンド ペーストします。actionPerformedTimer

于 2013-01-20T15:19:40.630 に答える
0

前述のように、Swing はシングル スレッドです。すべてのレンダリングを実行し、すべての Swing イベントが処理されるイベント ディスパッチ スレッドと呼ばれる単一のスレッドがあります (ユーザーActionListenersおよび他の種類のリスナーはすべてそのスレッドで実行されます)。GUI がハングする原因となるため、長時間実行されるプロセス (サーバー呼び出し、ディスク I/O、Thread.wait()) をそのスレッドで実行しないことが重要です。詳細と例については、このチュートリアルを参照してください。

あなたのケースでは、目的の効果のために構築されたように見えるため、 Swing Timersも確認することをお勧めします。

于 2013-01-20T15:21:48.913 に答える