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 メソッドをオーバーライドして、再描画を防ぐことができますが、問題に対するより良い解決策を聞きたいと思います。