3

背景と前景色が違うのですがJTextPane、L&FをニンバスL&Fに変更すると、JTextPane色が変わります。どうしてですか?このクラスだけが問題になっていますが、他のクラスはうまくいきますが、何が問題なのですか?

これが私がL&Fを変更する方法です:

for (javax.swing.UIManager.LookAndFeelInfo info : 

javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(PlayBackVoice.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(PlayBackVoice.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(PlayBackVoice.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(PlayBackVoice.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }

一方、このL&Fを設定する前は、色が非常によく変化していました。または、これらのステートメントはうまく機能していました:

     jtp.setBackground(Color.BLACK);
     jtp.setForeground(Color.WHITE);

何が悪いのか分かりますか?

4

2 に答える 2

4

Swingコンポーネントは、ルックアンドフィールをComponentUIオブジェクトに委任します。Swingの一部として、コンポーネントごとに定義されたインターフェースがあります。ButtonUIこれは、、 for 、forなどにJButton委任します。LabelUIJLabelTextUIJTextPane

各Swingルックアンドフィールには、これらの各インターフェイスの実装が含まれています。例えば。MetalButtonUIMetalLabelUIなど、そのコンポーネントをペイントしますが、ルックアンドフィールは希望します。

あなたがそれを呼ぶときUIManager.setLookAndFeel、それはその実装のセットでスワップします。

すべて非常に賢いですが、厄介なのは、それぞれのルックアンドフィールが前景/背景/境界線などの設定を尊重する必要がないことです。

幸い、Nimbusはすべての色をUIManagerキーとして定義しています。

したがって、この種のことを実行して、デフォルトの色を上書きできます。

UIManager.put("nimbusBase", Color.BLACK);

完全なリストについては、こちらをご覧ください。

http://www.ce.unipr.it/people/poggi/teaching/docs/javaSE7.0Tutorial/uiswing/lookandfeel/_nimbusDefaults.html

アップデート

とはいえ、ニンバスが上手く演奏しているようには見えません!一部の人々はこれでニンバスの色を上書きする運がありました:

Color bgColor = new Color("99999");
UIDefaults defaults = new UIDefaults();
defaults.put("EditorPane[Enabled].backgroundPainter", bgColor);
jeditorpane.putClientProperty("Nimbus.Overrides", defaults);
jeditorpane.putClientProperty("Nimbus.Overrides.InheritDefaults", true);
jeditorpane.setBackground(bgColor);
于 2013-03-05T16:18:41.027 に答える
3

これは、スプーン氏の更新に対するわずかな更新です。実際にはコード

defaults.put("EditorPane[Enabled].backgroundPainter", bgColor);

put呼び出しの2番目のパラメーターは、Painterインターフェースを実装するオブジェクトである必要があるためです。

コードの正しいシーケンス(Nimbus LAFが選択されている場合)は次のとおりです。

UIDefaults defaults = UIManager.getLookAndFeelDefaults();
defaults.put("TextPane[Enabled].backgroundPainter", 
    new javax.swing.plaf.nimbus.AbstractRegionPainter() {

        @Override
        protected AbstractRegionPainter.PaintContext getPaintContext() {
            return new AbstractRegionPainter.PaintContext(null, null, false);
        }

        @Override
        protected void doPaint(Graphics2D g, JComponent c, 
                int width, int height, Object[] extendedCacheKeys) {
            g.setColor(bgColor);
            g.fillRect(0, 0, width, height);
        }
    });
jtxtPane.putClientProperty("Nimbus.Overrides", defaults);
jtxtPane.putClientProperty("Nimbus.Overrides.InheritDefaults", false);
于 2013-09-25T08:19:57.883 に答える