Неправильные цвета в JList при использовании Nimbus и Java 8U20

Мое приложение использует неправильные цвета для JList, так как я обновил до последней версии Java 8 (U20). Например, вместо темно-синего цвета для выбранных элементов используется светло-серый.

Простое тестовое приложение:

import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.plaf.nimbus.NimbusLookAndFeel;



public class Test {

    public Test() {
        try {
            UIManager.setLookAndFeel(new NimbusLookAndFeel());

            JList<String> l = new JList<>();
            DefaultListModel<String> model = new DefaultListModel<>();
            model.add(0, "sssssssss");
            model.add(1, "sssssssss");
            model.add(2, "sssssssss");
            model.add(3, "sssssssss");
            l.setModel(model);

            JFrame f = new JFrame();
            f.setSize(500, 500);
            f.setLocationRelativeTo(null);
            f.add(l);
            f.pack();
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f.setVisible(true);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }


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

        @Override
        public void run() {
            new Test();
            }
        });
    }    
}

Java 7, Java 8

Java 7, Java 8 <U20

Java 8 U20:

Java 8 U20

JList.getSelectionBackground() возвращается

DerivedColor(color=57,105,138 parent=nimbusSelectionBackground offsets=0.0,0.0,0.0,0 pColor=57,105,138

но на самом деле это не RGB(57,105,138), а вышеупомянутый светло-серый.

2 ответа

Решение

Вы можете восстановить точное поведение версий до 1.8.0_20 со следующим кодом инициализации:

final NimbusLookAndFeel laf = new NimbusLookAndFeel();
UIManager.setLookAndFeel(laf);
UIDefaults defaults = laf.getDefaults();
defaults.put("List[Selected].textForeground",
    laf.getDerivedColor("nimbusLightBackground", 0.0f, 0.0f, 0.0f, 0, false));
defaults.put("List[Selected].textBackground",
    laf.getDerivedColor("nimbusSelectionBackground", 0.0f, 0.0f, 0.0f, 0, false));
defaults.put("List[Disabled+Selected].textBackground",
    laf.getDerivedColor("nimbusSelectionBackground", 0.0f, 0.0f, 0.0f, 0, false));
defaults.put("List[Disabled].textForeground",
    laf.getDerivedColor("nimbusDisabledText", 0.0f, 0.0f, 0.0f, 0, false));
defaults.put("List:\"List.cellRenderer\"[Disabled].background",
    laf.getDerivedColor("nimbusSelectionBackground", 0.0f, 0.0f, 0.0f, 0, false));

Это отменяет то, что изменилось между 1.8.0_05 а также 1.8.0_20 в классе NimbusDefaults, Параметр false был удален (что превращает его эффективно в true через перегруженный метод). Это изменение превращает Colorс в UIResourceЧто может быть формально правильным, но по какой-то причине это вызывает проблему, с которой вы столкнулись. Так что вставив false восстанавливает старое поведение.

Я была такая же проблема. Вот как я решил это для моего приложения:

 ...

 for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
  ...

  UIManager.getLookAndFeelDefaults().put("List[Selected].textBackground", new Color(57, 105, 138));
  UIManager.getLookAndFeelDefaults().put("List[Selected].textForeground", Color.WHITE);

Вот список (цветных) ключей UIManager:

http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/_nimbusDefaults.html

Надеюсь, это поможет вам,

Изменить: протестировано с предоставленным кодом. Оно работает.

С наилучшими пожеланиями

Другие вопросы по тегам