4

アプリケーションのすべてのJPanelに異なる背景色を使用したいと思います。Nimbusのルックアンドフィールを使用する場合、どうすればよいですか?

ニンバスのルックアンドフィールのコンポーネントの色を変更するには、[色のテーマの変更]に従います。

それは時々、ランダムにしか機能しません。色を変更する前に設定した場合PropertyChagneListener、通知されるのは1回だけです。

ここにいくつかのテストコードがあります:

public class RedPanels extends JFrame {

  public RedPanels() {
    JPanel panel = new JPanel();
    add(panel);
    setPreferredSize(new Dimension(100, 100));
    pack();
    setVisible(true);
  }

  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

      @Override
      public void run() {

        try {
          for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                UIManager.setLookAndFeel(info.getClassName());
                UIManager.getDefaults().addPropertyChangeListener(
                                               new PropertyChangeListener() {

                  @Override
                  public void propertyChange(PropertyChangeEvent event) {
                    if (event.getPropertyName().equals("Panel.background")) {
                      System.out.println("color changed");
                    }

                });
                UIManager.put("Panel.background", new Color(255,0,0));
                break;
            }
          }
        } catch (Exception e) {
            // Nimbus is not available.
        }
        new RedPanels();
        }
    });
  }
}
4

3 に答える 3

6
UIManager.getLookAndFeelDefaults().put("Panel.background", Color.RED);
于 2011-11-25T07:22:17.807 に答える
2

3つの方法があります

nimbusBase1)セットのオーバーライドDerivedColor

2)独自の作成Painter、1つの例のみがあります-> aephyr codesource

3)色を直接設定するためのシンプルで汚いハック

ここに画像の説明を入力してください

import java.awt.*;
import javax.swing.*;
import javax.swing.border.LineBorder;

public class NimbusJPanelBackGround {

    public NimbusJPanelBackGround() {
        JPanel p = new JPanel();
        UIDefaults nimbusOverrides = new UIDefaults();
        nimbusOverrides.put("Panel.background", Color.blue);
        p.putClientProperty("Nimbus.Overrides", nimbusOverrides);
        SwingUtilities.updateComponentTreeUI(p);

        JPanel p1 = new JPanel();
        nimbusOverrides = new UIDefaults();
        nimbusOverrides.put("Panel.background", Color.green);
        p1.putClientProperty("Nimbus.Overrides", nimbusOverrides);
        SwingUtilities.updateComponentTreeUI(p1);
        p1.setBorder(new LineBorder(Color.black, 1));

        JPanel p2 = new JPanel();
        nimbusOverrides = new UIDefaults();
        nimbusOverrides.put("Panel.background", Color.ORANGE);
        p2.putClientProperty("Nimbus.Overrides", nimbusOverrides);
        SwingUtilities.updateComponentTreeUI(p2);

        JFrame f = new JFrame();
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.add(p, BorderLayout.NORTH);
        f.add(p1, BorderLayout.CENTER);
        f.add(p2, BorderLayout.SOUTH);
        f.setSize(200, 100);
        f.setLocation(150, 150);
        f.setVisible(true);
    }

    public static void main(String[] args) {

        try {
            for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(laf.getName())) {
                    UIManager.setLookAndFeel(laf.getClassName());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                NimbusJPanelBackGround nimbusJPanelBackGround = new NimbusJPanelBackGround();
            }
        });
    }
}
于 2011-11-23T18:50:47.003 に答える
2

jdk6のバグのように見えます。Panel.backgroundは取得されていないプロパティの1つです。jdk7での次の作業(シーケンスに注意してください:最初に色を設定し、次にLAFを設定します)

 UIManager.put("Panel.background", new Color(255,0,0));
 UIManager.setLookAndFeel(info.getClassName());

Nimbusはマネージャー設定の変更を受信するとプロパティを更新することになっているため、シーケンスを逆にして最初にNimbusを設定し、次に色を設定する)も機能するはずですが、機能しません。 jdk7で

 UIManager.setLookAndFeel(info.getClassName());
 UIManager.put("Panel.background", new Color(255,0,0));
 //UIManager.put("control", Color.MAGENTA);

Panel.background(およびおそらく他の多くのもの)に固有のようですが、LAFを設定する前と後の両方で、両方のjdkで「制御」は問題ありません。

于 2011-11-24T08:54:30.497 に答える