1

Web ページに Java JApplet を埋め込んでいます。JApplet ウィンドウには、JPanel を拡張するクラスのインスタンスが 1 つ含まれています。これは、JApplet と同じサイズです。アプレットは、ユーザーがパネル内のボタンをクリックすると、ポップアップ ウィンドウ (JFrame) を生成できます。

ボタンをクリックしてウィンドウをポップアップするたびに、再描画中にアプレットがちらつきます。もう一度クリックしたとき、またはフォーカスがあり、別のウィンドウをクリックしたときも同じです-私の結論: focusLost() および focusGained() イベントで強制されているのは再描画です。

次のように、パネルの paint() メソッドにダブル バッファリングを実装しています。

@Override
public void paint(Graphics g)
{
    if(resized)
    {
        offscreen = createImage(getWidth(),getHeight());
        resized = false;
    }

    Graphics offscreenG = offscreen.getGraphics();

    /// DRAW HERE:

    // paint the main window contents:
    view.paint(offscreenG);
    // paint the child components of our panel.
    super.paint(offscreenG);

    /// FRAW FINISHED

    g.drawImage(offscreen,0,0,this);
    offscreenG.dispose();
}

ビューオブジェクトはスイングコンポーネントではなく、Graphics オブジェクトにすべてを描画するホットなクラスです。

JApplet の paint() メソッドはオーバーライドされません。

おそらく、JApplet の focusGained/focusLost メソッドをオーバーライドして、再描画を防ぐことができますが、問題に対するより良い解決策を聞きたいと思います。

4

1 に答える 1

1

ダブルバッファリングを実装する必要はありません。これはSwingによって自動的に行われます。アプリケーションを作成するのと同じ方法でアプレットを作成します。つまり、JAppletのコンテンツペインにコンポーネントを追加します。

カスタムペイントを行う必要がある場合は、JPanelのpaintComponent()メソッドをオーバーライドして、パネルをアプレットに追加します。

例については、カスタムペインティングに関するSwingチュートリアルのセクションをお読みください。

于 2010-03-03T20:38:29.130 に答える