2

私は現在、コンテンツペインでゲームループから毎秒60フレームで画像を描画するJFrameを持っています。これは問題なく動作しますが、コンテンツ ペインの特定の部分を選択するときに情報を表示したい Swing 要素が右側に増えました。その部分は静的 GUI であり、ゲーム ループを使用しません。

私はこのように更新しています:

public class InfoPanel extends JPanel implements Runnable {
    private String titelType = "type: ";
    private String type;
    private JLabel typeLabel;
    private ImageIcon icon;

    public void update() {
        if (this.icon != null)
            this.typeLabel.setIcon(this.icon);

        if(this.type != null || this.type != "")
            this.typeLabel.setText(this.titelType + this.type);
        else
            this.typeLabel.setText("");
    }

    public void run() {
        try {
            Thread.sleep(150);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        this.update();
    }

(このメソッドは、プレーヤーが実際に移動したときにのみ呼び出されるため、1 秒間に 60 回ではなく、1 回だけ呼び出されます)

この update() メソッドをゲーム ループから呼び出すと、ちらつき効果が発生することに気付きました。これは、UI の更新に時間がかかるためだと思いますので、新しいスレッドに入れることにしました。これでちらつきは減りましたが、解決にはなりませんでした。

次に、1 秒間に 60 回再描画される画面の部分の方がはるかに重要であるため、新しいスレッドの優先度を低くすることにしました。これにより、ちらつきが再び減少しましたが、それでも発生しました。次に、Thread.sleep(150);update() メソッドを呼び出す前に新しいスレッドで使用することにしました。これにより、システムのちらつきが完全に解決されました。

ただし、他のシステムで実行すると、引き続き発生します。以前ほど頻繁ではありませんが (おそらく 20 秒に 1 回)、それでもかなり面倒です。どうやら、別のスレッドで UI を更新するだけでは問題は解決しません。

ちらつきを完全になくす方法はありますか?

4

2 に答える 2

4

スレッドを停止し、EDT で UI を更新する をupdate()呼び出します。SwingUtilities.invokeAndWait()

于 2011-11-22T09:33:58.650 に答える
3

問題は、Swing の Concurency でさらに GUI を停止してフリーズすることです。たとえばThread.sleep(int)Runnable # Threadを使用して GUI をフリーズするEventDispatchTreadThread.sleep(int)

Swing で何かを遅らせたい場合、最善の方法はjavax.swing.Timerを実装することです。

于 2011-11-22T09:31:40.893 に答える