2015-03-06 6 views
-1

В компании, где я работаю, мы получили класс от sun.awt.WToolkit, чтобы изменить некоторые цвета, позвонив по номеру setDesktopProperty(). И это прекрасно работало годами. Но теперь в JDK 8 WToolkit является окончательным и не может быть подклассифицирован. Легкий выход может вызвать неприятное отражение и вызвать защищенный метод, хотя я не уверен, что это не приведет к исключению безопасности или чем-то подобному.Можно ли изменить любой вид рабочего стола Windows Desktop и почувствовать?

Правильный выход - это изменить эти цвета с помощью Look and Feel. Oracle в Windows Desktop Property Support утверждает, что

программам не нужно напрямую обращаться к этим свойствам; внешний вид Windows автоматически считывает и интерпретирует эти свойства, чтобы обеспечить надлежащие визуальные эффекты и поведение компонентов.

Но это ничего не говорит о настройке этих свойств посредством модификаций LaF и, конечно же, делает UIManager.put("win.3d.shadowColor", Color.gray);, как указано в this doc, недействительно.

Так что мой вопрос: можно ли изменить свойства рабочего стола Windows путем подклассификации существующего Look and Feel, или я должен прибегнуть к какой-то взлому?

+0

Вопрос: Вы, кажется, использует System L & F и исправлен цвет через этот трюк? Нимбус (или любой другой) L & F не должен представлять никаких проблем. Могут ли помочь константы SystemColor? –

+0

@JoopEggen Я использую Windows LaF. Я не вижу никакого использования SystemColor в этой конкретной проблеме. Не могли бы вы рассказать? –

+1

Почему 'UIManager.put' неэффективен? – Holger

ответ

3

Swing's Windows Look & Feel будет импортировать свойства рабочего стола Window в свою таблицу по умолчанию, но в этой таблице используются стандартные, LaF-независимые имена, которые обычно состоят из имени и свойства компонента.

т.д .:

try { 
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
} catch(ClassNotFoundException|InstantiationException 
     |IllegalAccessException|UnsupportedLookAndFeelException ex) { 
    Logger.getLogger(LaFColors.class.getName()).log(Level.SEVERE, null, ex); 
    System.exit(1); 
} 
UIManager.put("Panel.background", Color.YELLOW); 
UIManager.put("Button.foreground", Color.BLUE); 
JFrame frame=new JFrame("Test"); 
frame.getContentPane().add(new JButton("See, it’s still " 
    +UIManager.getLookAndFeel().getName()+" LaF"), BorderLayout.NORTH); 
frame.setSize(200, 200); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.setVisible(true); 
+0

Итак, что вы на самом деле предлагаете, пусть LaF читает свойства 'win. *', А затем использует свойства LaF для изменения того, что вы хотите. Я признаю, что это самое близкое к тому, что я хочу. Но есть ошибка: эквивалент настройки «win.item.highlightColor» заключается в установке всех соответствующих свойств «Component.selectionBackground». Благодаря @camickr UIManager Defaults это проще, чем кажется. Но это накладывает больше испытаний, поэтому, возможно, решение отражения будет преобладать ... –

+0

Когда используется Windows LaF, некоторые компоненты компонентов окрашены с использованием Windows Theming API: например, на фоне JTabbedPane. Windows Classic LaF легче настроить, поскольку все цвета хранятся в UIManager. –