1

Java アプレットのバックバッファに関して小さな問題があります。現在、実行時のアプレットのサイズ変更については考慮していません。したがって、パネルのサイズが変更されますが、バックバッファーは初期サイズを維持します。したがって、アプレットの一部のみが再描画され、画像サイズでカバーされます。それにもかかわらず、私はイメージを再初期化しようとしました

private void createBackBuffer() {
    backBuffer = this.getGraphicsConfiguration().createCompatibleVolatileImage(getWidth(), getHeight());
    defaultComposite = ((Graphics2D) backBuffer.getGraphics()).getComposite();
    defaultStroke = ((Graphics2D) backBuffer.getGraphics()).getStroke();
}

// Reinit on resize
    public void adjustBackBufferSize() {
        if (backBuffer != null) {   
            backBuffer.flush();
            createBackBuffer();
        }
    }

残念ながら、それは感謝しない振る舞いです。ユーザーがブラウザー ウィンドウのサイズを変更するためにドラッグを開始するとすぐに、再作成は、描画するためのバックバッファーがないことを意味します。そのため、パネルがちらつき、灰色の背景、以前のパネル、またはレンダリングしようとしている実際の図面のいずれかが表示されます。

サイズ変更中に幅と高さにオフセットを設定してちらつきの動作を下げることを検討しましたが、これはまだ適切な方法ではないようで、単なる回避策です。

ちらつきなしでサイズを変更するための提案はありますか?!

敬具。

4

1 に答える 1

0

問題: 不要な再描画

ちらつきは、パネル自体が再描画されるために発生します。ウィンドウがちらつき始めたくないので、これらの再描画は望ましくありません。自動再描画を無効にすると、アプレットがいつ再描画するかを制御できます。できることは、新しいバッファが初期化されたら再描画を実行するようにコードを変更することです。


解決策、パート 1: 再描画を無効にする

次のことを試してください。

setIgnoreRepaint(true);

それでも何も起こらない場合は、main()メソッドを使用してクラスにこれを追加してみてください。

static {
    System.setProperty("sun.awt.noerasebackground", "true");
}

これにより、自動再描画が無効になりますが、他のコンポーネントにも自動的に再描画しないように指示する必要がある場合があります。SSCCE を投稿していただければ、さらにお手伝いできます。repaint()また、いくつかのテストを実行して、アプリケーションがまだ正常に動作するかどうかを確認してください。たとえば、最小化や復元中などに、いくつかの呼び出しを追加する必要がある場合があります。


ソリューション、パート 2: オンデマンドで再描画

が初期化された後に再描画が行われるようにするbackBufferため、コードを次のように変更します。

    // Reinit on resize
    public void adjustBackBufferSize() {
        if (backBuffer != null) {   
            backBuffer.flush();
            createBackBuffer();
            repaint();
        }
    }
于 2016-08-11T08:42:46.300 に答える