AWT Graphicsコンテキストを処理する最良の方法は何ですか?
質問
Swingアプリケーションの一部のユーザーは、ディスプレイに奇妙なアーティファクトが表示されると報告しています。これは、ウィンドウの領域をタイル張りの壁紙のように塗り直されているアプリケーションの全体の部分に至るまで、コンポーネントが1〜2秒間適切に再描画されないコンポーネントからの範囲です。
このアプリは、経験豊富なJavaの人から大学を卒業したばかりの若い人まで、すべてのレベルの開発者によって5年ほどかけて開発されてきました。 。今、私は今後数ヶ月かそこらでできる限り多くの悪を修正しようとする課題に直面しています。
これのいくつかは簡単に対処できます。コンポーネントはイベントディスパッチスレッドでのみ処理し、非同期でIOを実行します。そうすれば、チームの他のメンバーにメッセージを伝えることができます。
私が知りたいのは、特にpaintComponent()コンテキストで、Graphicsコンテキストを処理する最良の方法です。たくさん見えます...
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を元に戻すなど、良好な状態に復元する必要はありませんか?
解決
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の実装では、「サブグラフィックス」を破棄しなくても問題ありません。オブジェクト。 (そのことについては引用しないでください。)
そのコメントビットを別のオブジェクトに委任したい場合があります。
他のヒント
これはjdk-1.6.12で修正されたと聞きましたが、試しませんでした。