1

私は単純なゲームを作成しており、移動するたびにボードを再描画したいと考えています。したがって、move() を呼び出した後、次のことを実行したいと思います: (ちなみに、View はピースを保持する JComponent です。移動後にピースの数が変更されたため、再描画する必要があります)

for(View v : views){            
        v.repaint();
    }

動いていない。repaint()単一のビューを呼び出すと、正常に動作します。paintImmediately、およびrevalidate、および...を使用してみupdateましたが、ループ内では何も機能しません。

何か案は?前もって感謝します。

編集:ウィンドウのサイズが変更されたときにrepaint()が呼び出されることを追加する必要があるため、ViewのpaintComponentメソッドが有効で機能することがわかります。ループから呼び出されていないだけです。デバッガーがループを通過するとき、repaint() に入らず、画面には何も起こりません。

4

2 に答える 2

1

UIに関連するものはすべて、イベントディスパッチスレッド(EDT)で呼び出す必要があります。

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        for(View v : views){
            v.repaint();
        }
    }
});

invokeLaterの代わりにinvokeAndWaitを使用することもできます。レスポンシブアプリケーションが必要な場合は、EDTをお読みください。

たとえば、actionListenerをボタンに追加すると、そのactionListenerで実行されるコードはEDTスレッドで実行されるため、プロセスを制限する必要があります。そうしないと、UIが応答を停止します。

また、SwingUtilities.isEventDispatchingThread()もご覧ください。

于 2011-01-14T20:21:16.243 に答える
0

最も近い validateRoot が JScrollPane の場合、再検証が機能しないことがあります。理由がわからない。フレーム自体で revalidate を呼び出して、それが機能するかどうかを確認してください。その場合、validateRoot がコンポーネントを適切に検証していないという問題があります。ループが終了したら、 revalidate を 1 回だけ呼び出す必要があります。

于 2011-01-12T21:41:36.430 に答える