4

基本的に、私は透明な JPanel をたくさん描いています。プロファイリングは、ほとんどの時間が Component.paint() に費やされていることを示しています。ほとんどの場合、JPanel ごとの実際の非透過領域は非常に小さいため、たとえばエッジの周りなど、これを非常に根本的に最適化することが可能です。

現状では、RepaintManager はダーティな親領域が実際には不透明であり、コンポーネント階層を上っていくことがわからないため、コンポーネントを repainting() すると、すべての親の再描画がトリガーされます。markCompletelyClean()パネルが無効化されるたびにすべての親に電話をかけ、自分でダーティ リージョンを管理することを考えていましaddDirtyRegion()た。

ただし、JPanel の特定の四角形のみを不透明 (または透明、問題ではない) としてマークする、よりクリーンなアプローチはありますか?

4

3 に答える 3

2

markCompletelyClean() と addDirtyRegion() で凝ったことをしたとしても、パフォーマンス上のメリットが得られるとは思えません。Swing が再描画する場合、すべてのダーティ リージョンを照合してペイントし、すべてのダーティ リージョンの最小バウンディング ボックスで再ペイントを開始します。したがって、JPanel の周囲をダーティとしてマークすると、JPanel のバウンディング ボックスは JPanel 全体と同じになります。つまり、何らかの方法で全体を再描画することになります。

于 2011-11-17T23:04:00.993 に答える
2

JLabelの代わりに (デフォルトでは不透明でない)を使用することを検討してください。そうすれば、 (JPanelに)と同じものをJLabel追加できますが、 を設定する必要があります。JComponentJPanelLayoutManagerOpacity/Transparency

于 2011-11-17T23:09:32.807 に答える
1

myRepaint()複数を呼び出す独自のメソッドを定義できないのはなぜですか

public void repaint(long tm, int x, int y, int width, int height)

すべての国境のために?

また、Graphics の clipBounds をいじって、本当に必要な部分だけを再描画してみてください。任意のカスタム シェイプをクリップとして設定できます。

于 2011-11-18T05:44:37.477 に答える