Swing Как мне разрешить выбранную пользователем тему? - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь разрешить пользователям изменять тему приложений, например, темный / светлый и т. Д.

Для этого я уже использовал:

for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if (newTheme.equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        SwingUtilities.updateComponentTreeUI(getRootPane());
                    }
                });


                break;
            }
        }
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
    }

Я не уверен, что мне действительно следует изменить весь внешний вид. Проблема с использованием этого метода заключается в том, что я не вижу способа установить jPanel для чего-либо, что изменится с темой.

Примером того, что я имею в виду, является что-то вроде настройки: jPanel 1 для цвета: меню jpanel 2 для цвета: фон

Где в теме 1, меню может быть серым, а фон - синим. В теме 2 меню будет зеленым, а фон красным -

Ответы [ 2 ]

0 голосов
/ 27 июня 2019

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

Чтобы быть более конкретным - разные L & F будут иметь разные размеры компонентов, расстояния, границы и только общий визуальный стиль (если вы не используете тот же L & F, но с разными темами / оболочками). В результате во многих случаях пользовательский интерфейс вашего приложения будет выглядеть и работать непоследовательно на разных L & F, особенно если вам нужно иметь темные и светлые темы, но одинаковый макет / стиль пользовательского интерфейса. Изменение L & F во время выполнения может также до некоторой степени сбрасывать состояние некоторых компонентов, что потенциально может привести к логическим ошибкам в вашем приложении.

Лучшим подходом является использование одного L & F, который поддерживает темные и светлые (или любые другие) темы / оболочки, поскольку проблем, несомненно, будет гораздо меньше, если вы будете переключаться между разными реализациями / конфигурациями того же L & F, что и L & F Разработчик, скорее всего, объяснил эту возможность. Вы можете найти полный список доступных в настоящее время L & F по другой теме SO здесь: Java Look and Feel (L & F)

Хотя написание собственного L & F также может быть хорошим решением, если вы готовы в него инвестировать. Но не заблуждайтесь, это не простая задача, и для ее создания потребуется много времени и знаний Swing. В частности, Swing и L & F API довольно плохо документированы, и оригинальный разработчик не дал много советов о том, как их создать. Вы можете идти только путем проб и ошибок.

0 голосов
/ 27 июня 2019

Вы пытались реализовать объекты SystemColor?SystemColors может измениться.Их красные / зеленые / синие значения привязаны к основной теме ОС.Если пользователь, например, меняет цвет выделения текста своей темы ОС, то вместе с ним изменяется и SystemColor.textHighlight.При следующей перерисовке любой компонент Java, который использует этот объект SystemColor, перерисовывает с обновленным цветом пользователя.

Эта функция SystemColors позволяет приложениям Java рисовать пользовательские интерфейсы с цветовыми схемами, которые отслеживают предпочтения цветовой схемы собственной операционной системы пользователя.Который для большинства случаев, таких как ваш, не требует специального кодирования приложения.Надеюсь, это поможет!

  • Робин.
...