5

カスタム ListCellRenderer があり、デフォルトの Nimbus 選択背景色を使用したいと考えています。次の方法で色を検索できます。

Color selectionBackground = UIManager.getColor("nimbusSelectionBackground");

印刷すると、 Nimbus default colorsと同じ値になります。しかし、JPanel で使用すると別の灰色になります。UIManager の色を使用するにはどうすればよいですか?

私がする時:

setBackground(Color.RED);

JPanels の背景は赤で表示されますが、実行すると:

setBackground(selectionBackground);

「selectionBackground」の色は使用されませんが、灰色です。


例とスクリーンショットを次に示します。

ここに画像の説明を入力

背景は次のようにする必要があります。

ここに画像の説明を入力

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;

public class PanelColor {

    public static void main(String[] args) {

        // switch to Nimbus Look And Feel
        for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                try {
                    UIManager.setLookAndFeel(info.getClassName());
                } catch (Exception e) { e.printStackTrace(); }
                break;
            }
        }

        Color selectionBackground = UIManager.getColor("nimbusSelectionBackground");

        JPanel panel = new JPanel(new BorderLayout());
        panel.setPreferredSize(new Dimension(300,50));
        panel.add(new JLabel(selectionBackground.toString()), BorderLayout.NORTH);

        // is not showing the selectionBackground color
        panel.setBackground(selectionBackground);

        JFrame frame = new JFrame();
        frame.add(panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}
4

2 に答える 2

5

ニンバスが色の設定に「抵抗」するとは思わない。UIManager.getColor() が ColorUIResource のインスタンスを返すため、デフォルトをオーバーライドしていないと誤って想定します。

ColorUIResource は、UIResource マーカー インターフェイスを実装する単なる Color です。Javadoc によると、L&F は「このインターフェースを使用して、プロパティ値がオーバーライドされているかどうかを判断します」。Nimbus は背景色をチェックし、オーバーライドしていないことに気づき、予期しない内部動作にフォールバックします。

于 2012-01-10T17:55:48.257 に答える
4

Nimbus は、その色が他の場所で使用されることに抵抗しているようです。私も少し前にこれに出くわしましたが、当時の私の最善の解決策はColor、コンポーネントを使用して新しいものを作成し(クエリできます)、それを使用することでした。もちろん、L&Fが変わってもその色のままです。

DerivedColorそれが UIManager から返される要点であることはわかっています。私はより良い解決策を見つけていません。

これは、他の L&F などについても同様です。たとえば、GTK L&F は希望するアイコンを喜んで提供しますが、独自のコントロールを描画しません。これの一部は、Swing が (a) 恐ろしく複雑であり、(b) 最新で最もクールなものであるにもかかわらず、Nimbus でさえ実際にコントラクトに準拠している L&F が存在しないことにあると思います。

于 2011-09-08T19:53:13.677 に答える