Как использовать цвет Nimbus по умолчанию с UIManager? - PullRequest
5 голосов
/ 08 сентября 2011

У меня есть собственный ListCellRenderer, и я хотел бы использовать цвет фона Nimbus для выбора по умолчанию. Я могу найти цвет с:

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

, и если я его распечатаю, он имеет те же значения, что и для Цвета по умолчанию Nimbus . Но когда я использую его на JPanel, я получаю другой серый цвет, как я могу использовать цвет из UIManager?

Когда я делаю:

setBackground(Color.RED);

Фон JPanels отображается красным, но когда я это делаю:

setBackground(selectionBackground);

Цвет "selectionBackground" используется не , а серый.


Вот пример и скриншот:

enter image description here

Фон должен быть:

enter image description here

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);
    }
}

Ответы [ 2 ]

5 голосов
/ 10 января 2012

Я не думаю, что Nimbus "сопротивляется", устанавливая цвет.Это ошибочно предполагает, что вы не переопределили значение по умолчанию, потому что UIManager.getColor () возвращает экземпляр ColorUIResource.

ColorUIResource - это просто Color, который реализует интерфейс маркера UIResource.Согласно Javadoc, L & F "используют этот интерфейс, чтобы решить, было ли переопределено значение свойства".Nimbus проверяет цвет фона, замечает, что вы не изменили его, и возвращается к некоторому внутреннему поведению, которого вы не ожидаете.

4 голосов
/ 08 сентября 2011

Nimbus, по-видимому, сопротивляется тому, что его цвета используются в других местах.Я тоже наткнулся на это некоторое время назад, и тогда лучшим решением было создать новый Color с использованием компонентов (вы можете запросить) и использовать его.Конечно, тогда вы придерживаетесь этого цвета, даже если L & F меняется.

Я знаю, что в этом весь смысл DerivedColor, который вы получаете от UIManager.Хотя я не нашел лучшего решения.

То же самое относится и к другим L & F и другим вещам.Например, GTK L & F с радостью даст вам иконки, которые вы хотите иметь, но они не будут рисовать в ваших собственных элементах управления.Я полагаю, что отчасти это связано с тем, что Swing (а) ужасно сложен и (б) никакой L & F на самом деле не придерживается контрактов, даже Nimbus, несмотря на то, что он самый новый и крутой.

...