1

すべてがを使用する3つの内部パネルを備えたパネルがありますTitledBorder。3番目の内側のパネルには、でペ​​イントされたカスタムテキストフィールドがいくつかありますGradientPaintJTextFieldテキストフィールドは、オーバーライドさpaintComponentれたメソッドを拡張して使用するカスタムクラスから取得されるMouseListenerため、マウスがテキストフィールド領域に入ると、グラデーションの色がわずかに変化します(マウスがテキストフィールドを離れると再び戻ります)。

問題は、これらのテキストフィールドがTitledBorder(ちなみに複合境界線)のあるパネル内にある場合、グラデーションの色の変更がうまく機能しないことです。私は彼らが十分に速く反応しないことを意味します、しかし彼らがそのようなパネルにいないとき彼らはうまく反応します(私はこれをテストしました)。

問題は境界線自体にあると思ったので、境界線を描画するためにこのメソッドが呼び出されるたびにprintステートメントを追加したTitledBorder'sメソッドをオーバーライドしようとしました...そして、マウスがテキストフィールドの領域に入るたびに(paintBorder()グラデーションの色が変わります)TitledBorder再びペイントされます。マウスポインタをすべてのテキストフィールド(そのうちの4つだけ)にすばやく移動すると、テキストフィールドが再度ペイントされますが(これは正常です)、コンパウンドTitledBorderも毎回ペイントされるため、パフォーマンスの問題が発生すると思います。

TitledBorder私の質問は単純ですが、マウスがパネルの内部コンポーネント上を移動するたびにパネルを再度ペイントしないようにJavaに指示する方法はありますか?

これにより、問題が発生する場合があることを理解しています。たとえば、コンボボックスのある小さなタイトル付きの境界線パネルがある場合:そのコンボボックスをクリックすると、ポップアップメニューがパネルの境界線の一部を非表示にする可能性があります(コンボボックスが境界線の下部に近い場合)サイド)、したがって、ポップアップメニュー自体が再び非表示になると、境界線を再度ペイントする必要があります。そうしないと、ポップアップメニューと境界線が重なったスペースに「空白」の領域が残ります。

しかし、パネルにテキストフィールドしかない前のケースでは、マウスがパネルの領域に移動したときに境界線を再度ペイントする必要がない場合、paintComponent()呼び出されないようにすることは許容されますか?はいの場合、どのように実行されますか?(または、私が思いもよらなかったまったく異なることを試してみる必要があります-申し訳ありませんが、私はあまり経験がありません)。

グラデーションテキストフィールドpaintComponent()メソッドのコードとで発生する変更を提供できますmouseEntered()が、問題の原因は明らかであり、なぜ発生するのかについての私の仮定は正しいと思いました(間違っている場合は訂正してください)...

編集:

sscceを作成しようとしてカスタムクラスを実行しているときに、非常に愚かな間違いを発見しました。標準のTitledBorderの代わりに、次のようなCustomTitledBorderクラスを使用していました。

1)タイトル付きの境界線の右側に追加された2つの余分なピクセルを削除しました。2)複合境界線と異なるフォント(パラティノボールド)を使用しました。

問題は、palatinoフォントがメモリに保存されておらず、カスタムクラスのコンストラクターが呼び出されるたびにディスクから読み取られることでした。そのため、paintBorder()が呼び出されるたびにも呼び出されました。そのため、マウスが上記の境界線のあるパネルのテキストフィールド上を移動するたびに呼び出されました。これは非常に愚かでした、私はこれについて申し訳ありません(そして私は1日以上パフォーマンスの問題を理解しようとしていました)。

これは、マウスがテキストフィールド上にあるたびにpaintBorderが実行されないようにする方法についての私の質問には答えませんが、もう必要ありません(とにかくそれが受け入れられるかどうかはわかりません)。

4

1 に答える 1

2

ここここBufferedImageに示すように、グラデーションをキャッシュします。ここに示されている、も考慮してください。TexturePaint

于 2012-08-25T18:16:02.813 に答える