3

私は現在、大学のコースのグループ プロジェクトに取り組んでいますが、ちょっとした障害にぶつかりました。私たちが実装することを決定したプログラムは、ユーザー名などを保存および共有するための中央サーバーを備えたピアツーピア チャット クライアントです。私は GUI を担当するように割り当てられました。

友人が冗談めかして「燃えるような背景を入れてはどうか」と提案してくれました。そこで、ユーザーが選択した背景画像を使用することにしました。このままでは、背景画像の一部のみが表示され、その上にすべてのコンポーネントが表示されるため、半透明を実装することにしました。

これは私の問題があるところです:

入力ボックスからチャット ウィンドウに情報を送信したり、フレンド リストをナビゲートしたり、チャット ウィンドウをスクロールしたりすると、奇妙なアーティファクトが残されます。これらのアーティファクトは、[送信] ボタンの半透明の「ゴースト」、メニューの一部、または古いテキストである場合があります。フレーム全体が適切に再描画されていないように見えますが、それがどのように機能するかはわかりません。

JTextComponent を実装するコンポーネントの場合、選択色を半透明に設定しています。他のコンポーネントについては、背景を半透明に設定しています。コンポーネントを見て、それが何であるかに応じてその半透明度を設定し、それが何らかのコンテナであるかどうかを確認し、各アイテムの半透明度を再帰的に設定する setTranslucency(Component com) 関数があります。

現在、この問題を解決するために私が見つけた方法は、ウィンドウを見えないようにドラッグすることです (ウィンドウを最小化するか、画面外にドラッグして戻すなど)。

そう、

1) ウィンドウを画面の外にドラッグしたり最小化したりしたときのように、ウィンドウ全体を強制的に更新する方法はありますか?

また、

2) そもそも私のやり方が悪いのでしょうか? もしそうなら、どうすれば修正できますか?

参照用の写真は次のとおりです。

http://i.stack.imgur.com/4J9GJ.png

4

3 に答える 3

3

コンポーネントが半透明であることを Swing に伝える必要があるため、変更されたコンポーネントを再描画するときに背景も描画されます。このために、コンポーネントはメソッドから戻る必要がありますfalse(これは、サブクラスが他の何かを行うために上書きされない場合isOpaque()に達成できます)。setOpaque(false)isOpaque

これにより、他の回答が提案したように、すべてを手動で再描画することなく機能するはずです。(私はすでに一度これをしました。)

編集:この理由は、Swing が最適化された再描画アルゴリズムを使用して、実際に再描画が必要なコンポーネント (たとえば、入力後の JTextField) またはそのようなコンポーネントの前にあるコンポーネントのみを再描画するためです。再描画が必要なコンポーネントが不透明でない場合 (= 空間全体が半透明でない色で塗りつぶされている場合)、その背後にあるコンポーネントの再描画も必要です。

于 2011-02-12T21:23:19.897 に答える
0

myComponent.revalidate();
myComponent.repaint();
再描画を「強制」するかどうかはわかりませんが、可能な場合は再描画を要求します。

于 2011-02-12T19:57:47.307 に答える
0

試してみてくださいJFrame.repaint()。それはうまくいくはずです。カスタム設計が必要な場合は、JFrame のメソッドJFrameをオーバーライドする必要があります。paint()さらに、各コンポーネントをカスタム設計したい場合はpaint()、各 GUI コンポーネントのメソッドをオーバーライドする必要があります。いくつかの注意事項:

  1. paint()GUI コンポーネントを呼び出す必要はありません。に電話するだけですrepaint()
  2. JButton他の GUI コンポーネント [ 、 ...]をオーバーライドする場合、それらのメソッドJTextFieldを呼び出す必要はありません。repaint()Containerの [ JFrameJPanel...]repaint()が仕事をします。
于 2011-02-12T20:57:08.627 に答える