11

透明にすることを目的としたいくつかの場所で無効なJTextFieldsを使用するアプリケーションがあります。これにより、テキストフィールドの通常の背景の代わりに背景が透けて見えます。

新しいNimbusLAFを実行すると、これらのフィールドは不透明になり(setOpaque(false)を設定しているにもかかわらず)、UIが壊れます。LAFが不透明なプロパティを無視しているようです。背景色を明示的に設定することは、いくつかの場所で困難であり、背景画像が実際には機能しないため、最適ではありません-それでも、LAFのデフォルトの背景を上にペイントし、境界線のような外観を残します(下のスプラッシュ画面には背景は画像と一致するように明示的に設定されています)。

NimbusにJTextFieldの背景をペイントしないようにする方法についてのアイデアはありますか?

注:スレッドセーフなsetText()とラッピング機能が必要なため、JLabelではなくJTextFieldが必要です。

注:私のフォールバックポジションは、システムLAFを引き続き使用することですが、ニンバスの方がかなり見栄えがします。

以下の画像の例を参照してください。


結論

この動作の驚きは、setOpaque()が何を意味するのかを誤って解釈したことによるものです-Nimbusバグレポートから:

これは、Swingの元の設計と、それが何年にもわたって混乱してきた問題です。問題は、setOpaque(false)がLAFの終了に副作用をもたらしたことです。これは、背景を非表示にすることであり、実際にはその目的ではありません。コンポーネントには透明なパーツがあり、スイングはその背後にある親コンポーネントをペイントする必要があると言っても過言ではありません。

NimbusコンポーネントもsetBackground(null)を尊重していないように見えるのは残念です。そうしないと、背景のペイントを停止するための推奨される方法になります。完全に透明な背景を設定することは、私には直感的ではないようです。

私の意見では、setOpaque()/ isOpaque()は誤ったパブリックAPIの選択であり、次のようになっているはずです。

public boolean isFullyOpaque();

isOpaque()== trueはSwingとの契約であり、コンポーネントサブクラスが背景全体のペイントを担当するためです。つまり、親は必要に応じてその領域のペイントをスキップできます(これは重要なパフォーマンスの向上です)。外部の何かがこの契約を(合法的に) 直接変更することはできません。その履行はコンポーネントにコード化される可能性があります。

したがって、コンポーネントの不透明度は、setOpaque()を使用して設定可能であってはなりません。代わりに、setBackground(null)のようなものを使用すると、多くのコンポーネントに「背景がない」ため、完全に不透明になりません。例として、理想的な世界では、ほとんどのコンポーネントに次のようなisOpaque()が必要です。

public boolean isOpaque() { return (background!=null); }

例

代替テキスト

4

4 に答える 4

17

先週、JTextPane を使用して同じ問題に遭遇しました。setOpaque() メソッドは、Nimbus 以外のルック アンド フィールを使用する場合に期待どおりに機能します。どうやら、Nimbus のルック アンド フィールは、多くのコンポーネントの setOpaque() で期待されるようになった動作を変更します。見方によっては、バグと見なすこともできます。この sun bugid のコメントを確認してください。

ニンバスの不透明なバグ

私のために働いた回避策は次のとおりです。

myPane.setOpaque(false); // added by OP
myPane.setBorder(BorderFactory.createEmptyBorder());
myPane.setBackground(new Color(0,0,0,0));

OP からのメモ: 親の背景が描画されるように、JTextField の setOpaque(false) も確認する必要がありました。

于 2009-03-05T17:25:59.170 に答える
0

javadocから

public void setBackground(Color bg)

このコンポーネントの背景色を設定します。背景色は、コンポーネントが不透明な場合にのみ使用され、JComponentまたはComponentUI実装のサブクラスによってのみ使用されます。JComponentの直接サブクラスは、このプロパティを尊重するためにpaintComponentをオーバーライドする必要があります。

このプロパティを尊重するのはルックアンドフィール次第であり、無視することを選択する人もいます。

于 2009-03-06T13:28:18.250 に答える
0

ねえ、ソフトウェアモンキー。

mmhh実際にsetOpaqueの動作を尊重するUIのサブクラス置換をインストールするのはどうですか。

setUIのようなものだと思います。

ニンバスのソースコードを入手して、そこで何が壊れているかを確認し(ある場合)、サブクラス化して「修正済み」のものをインストールすることができます。

あなたのサウンドは非常に興味深いものですが、私たちが見ることができるスクリーンショットはありますか?

于 2009-03-05T04:56:58.190 に答える