9

ペイントまたはpaintComponentを上書きするJavaコードのほとんどは、グラフィックオブジェクトの状態を変更した後、グラフィックオブジェクトの古い状態を復元しないことに気付きました。たとえば、setStroke、setRenderingHint .. ..

メソッドから戻る前に、グラフィックスオブジェクトの古い状態を復元するのは良い習慣かどうか疑問に思いました。例えば

public void paintComponent(Graphics g) {
    super.paintComponet(g);
    Stroke oldStroke = g.getStroke();
    g.setStroke(newStroke);
    // Do drawing operation.
    g.setStroke(oldStroke);
}

これは良い習慣ですか?またはそれは終わりましたか?

4

2 に答える 2

16

渡されたGraphicsオブジェクトを変更するのではなく、そのコピーに対してすべてのグラフィックス操作を実行してから破棄する必要があります。その場合、状態をリセットする必要はまったくありません。

public void paintComponent(Graphics g1) {
    super.paintComponent(g1);
    final Graphics2D g = (Graphics2D)g1.create();
    try {
         // ...Whole lotta drawing code...
    } finally {
         g.dispose();
    }
}
于 2009-05-23T09:00:06.077 に答える
3

はい、これは従うべき非常に良い習慣です。 (実際のペイント操作に比べて)パフォーマンスにあまりお金をかけず、グラフィックスコンテキストに異常な変更を加えている場合は、面倒な作業を省くことができます。ただし、やりすぎないでください。たとえば、色の設定について心配する必要はないでしょう。

別の方法は、グラフィックスコンテキストについて何も想定せず、すべてのペイントの前に必要なすべてのプロパティを設定することです。 すべての操作でGraphicsオブジェクトを自由に作成および破棄しないようにしてください。

変更された場合に常に復元する必要がある特定のプロパティ:(それらは悪いことをする可能性があり、予期しない結果をもたらす可能性があるため):

  • 変換-これに対する変更は互いに重なり合い、リセットするのが非常に困難になるためです。注意:これは、Graphics2Dの変換、せん断、スケーリング、回転、および変換メソッドによって変更されます。変換の変更は注意して使用する必要があります。
  • ストローク-(少なくとも私の構成では)このデフォルトのままにしておくと、デフォルトと同等であっても、どの設定よりもはるかに高速に実行されます。聞かないでください。これは、Java2Dグラフィックパイプラインがグラフィックハードウェアを使用してデフォルトのケースを加速した結果です。
  • クリップ:画面の一部だけが描画される奇妙なバグが発生します。
  • 複合:ほとんどの操作は、おそらくこれが何か奇妙なものになることを期待していません。

心配しないプロパティ:

  • RenderingHints。これらは簡単に設定および復元できるものであり、通常、アプリの実行中は常に特定の方法(アンチエイリアスなど)で設定したままにしておきます。RenderingHintsを変更しても、コンポーネントのレンダリングが壊れることはめったにありませんが、見栄えが悪くなる可能性があります。
  • 背景色とペイントカラー。とにかく描画する前に、ほとんどのものがこれらを変更します。
  • フォント:同様に。
于 2009-05-23T07:14:17.910 に答える