0

したがって、この問題の最初のセットアップは、JDialog があり、その中に残りのコンポーネントを収容する JPanel を配置したことです (JDialog 自体をペイントすることは明らかに悪い考えであるため)。この JPanel には、オーバーライドされた paintComponent(Graphics g) メソッドがあり、背景のみをペイントし、審美的な目的でかすかな境界線を追加します。

その内部には、含まれているフォーム コンポーネントを分類する一連の JPanel があり、各 JPanel にはオーバーライドされた paintComponent(Graphics g) もあり、半透明の背景を描画します。

これらの JPanel のそれぞれの内部で、おそらく透過性に関していくつかの問題が発生し始めます。これらのパネル内に JTextFields、JCheckBoxes、JLabels、JSliders などがあります。いずれかを操作すると (ホバー、クリックなど)、背景が透明から不透明になり、別のフィールドからのゴースト画像が時折表示されます (これはわずかにランダムに表示されます)。時折)。Web というカスタム LAFを使用していますが、他の組み込み LAF でテストしたところ、同じことが起こりました。

これはJavaの不具合ですか、それとも何かを台無しにしましたか? もしそうなら、どうすればこれを修正できますか?必要に応じて後でコード フラグメントを貼り付けることができますが、いくつかのカスタム クラスと 9 パッチ スタイルのイメージ ステッチを使用したため、コード フラグメントを追跡するのが難しくなる場合があります。前もって感謝します!

4

1 に答える 1

4

透明な背景を持つコンポーネントをペイントする場合、コンポーネントを透明 ( setOpaue(false)) としてマークして、その下のコンポーネントをペイントする必要があることを再ペイント マネージャが認識できるようにすることが非常に重要です。

また、カスタム ペイントを実行するときにsuper.paintComponent最初に呼び出すことも非常に重要です。

これは、Graphicsペイントのコンテキストを準備するため、透明なコンポーネントの場合に特に重要です。

Graphics共有リソースです。ウィンドウにペイントされたすべてのコンポーネントは同じGraphicsオブジェクトを共有します。つまり、最初にそれを準備することを許可しない場合paintComponent、以前にペイントされたものが表示されます。

于 2013-06-22T21:26:50.033 に答える