4

私たちの Swing アプリケーションの一部のユーザーは、奇妙なアーティファクトがディスプレイに表示されると報告しています。これは、コンポーネントが 1 秒か 2 秒間適切に再描画されないことから、アプリケーション全体が、ウィンドウの領域を覆うタイル張りの壁紙のように再描画されることまで、さまざまです。

このアプリは、経験豊富な Java の専門家から大学を出たばかりの若手まで、あらゆるレベルの開発者によって 5 年ほどかけて開発されてきました。私は今、次の数ヶ月かそこらで、できるだけ多くの悪さを正そうとする仕事に直面しています.

これのいくつかは簡単に対処できます。イベント ディスパッチ スレッドでのみコンポーネントを処理し、非同期で IO を実行すると、チームの他のメンバーにメッセージが伝わることを願っています。

私が知りたいのは、グラフィックス コンテキスト、特に paintComponent() コンテキストを処理する最善の方法です。私はたくさん見ます...

public void paintComponent( Graphics g ) {
    super.paintComponent( g );
    Graphics2D gfx = (Graphics2D)g;
    // ...Whole lotta drawing code...
}

これを行う方が良い方法ですか?

public void paintComponent( Graphics g ) {
    super.paintComponent( g );
    Graphics2D gfx = (Graphics2D)g.create();
    // ...Whole lotta drawing code...
    gfx.dispose();
}

g パラメータが他のペイントで再利用される場合、それを良好な状態に復元したり、AffineTransforms を元に戻したりする必要はありませんか?

4

2 に答える 2

5

Filthy Rich Clients によると、Graphics渡されたオブジェクトを変更するべきではありません (これは API、IMO として最悪です)。

それを処理する正しい方法は、もう少し冗長です。

public void paintComponent(Graphics g1) {
    super.paintComponent(g1);
    final Graphics2D g = (Graphics2D)g1.create();
    try {
         // ...Whole lotta drawing code...
    } finally {
         g.dispose();
    }
}

IIRC、Sun の実装では、「サブグラフィックス」オブジェクトを破棄しなくても問題ありません。(それについて私を引用しないでください。)

そのコメント ビットを別のオブジェクトに委任したい場合があります。

于 2009-03-02T15:41:21.817 に答える
-1

これは jdk-1.6.12 で修正されたと聞きましたが、試していません。

于 2009-03-02T15:21:37.933 に答える