#java #swing #javafx #netbeans #netbeans-platform
#java #swing #javafx #netbeans #netbeans-платформа
Вопрос:
Вступление
Я должен запрограммировать толстый клиент, используя платформу NetBeans и JavaFX 11. Одним из требований является предложение темной темы по умолчанию для приложения. Поэтому, если пользователь приложения нажимает кнопку темного режима, графический интерфейс приложения должен использовать темную тему.
Проблема
Хотя для меня очевидно, как стилизовать компоненты JFX (через файл CSS), файл CSS не влияет на компоненты платформы NetBeans, такие как строка меню, потому что они основаны на Swing. Например, компоненты JavaFX внутри объекта сцены получили темный стиль, но строка меню NetBeans по-прежнему светлая.
Вопрос
Как можно программно изменить стиль компонентов платформы NetBeans (так же, как вы бы сделали с CSS в веб-разработке или с поддержкой CSS в JavaFX)?
Ответ №1:
В платформе есть встроенный dark LAF (по крайней мере, в NB12, который я использую), называемый FlatDarkLaf, он выглядит красиво.
Чтобы использовать его, вам нужно добавить следующий код в validate()
метод ModuleInstall
подкласса, чтобы это было сделано очень рано в процессе запуска.
NbPreferences.root().node("laf").put("laf", "com.formdev.flatlaf.FlatDarkLaf");
UIManager.installLookAndFeel(new UIManager.LookAndFeelInfo("FlatLaf Dark", latDarkLaf.class.getName()));
Чтобы вернуться к теме по умолчанию:
NbPreferences.root().node("laf").remove("laf");
Я не знаю (простого) способа изменения LAF без перезапуска.
Для получения более полного примера кода взгляните на мое приложение JJazzLab-X на GitHub, в модуле UISettings
Netbeans.
РЕДАКТИРОВАТЬ для Netbeans 12.5
Нет необходимости вызывать installLookAndFeel()
, NbPreferences
достаточно обновления.
Модуль, который обновляется NbPreferences
, также должен зависеть от платформенного модуля Netbeans, отличного от API FlatLaf Look and Feel
.
Если ваше приложение на платформе Netbeans использует фирменный стиль Netbeans (например, для настройки значка и заставки), оно создает файлы, например, frame.gif
в вашем каталоге фирменного стиля. Но во время выполнения, если вы запускаете темную тему, такую как FlatDarkLaf, Netbeans ожидает, что значок будет назван frame_dark.gif
, поэтому вам следует переименовать их. См. javadoc ImageUtilities.loadImage()
для получения дополнительной информации.
Комментарии:
1. Еще раз спасибо. UIManager — это то, что я искал. Я добавил код, как я изменяю LAF во время выполнения.
2. Странно, что это необходимо, как и я, за исключением того, что это делается самим модулем FlatLaf: github.com/apache/netbeans/blob/master/platform /…
3. Возможно, вы захотите проверить, существует ли предпочтение, прежде чем перезаписывать существующее значение:
if (NbPreferences.root().node("laf").get("laf", null) == null) { ... }
Ответ №2:
Для полноты я добавляю фрагмент кода, который решил мою проблему:
private void toggleLookAndFeel() {
final boolean darkModeEnabled = UIManager.getLookAndFeel().getName().equals("Flat Dark");
final String darkLookAndFeel = "com.formdev.flatlaf.FlatDarkLaf";
final String defaultLookAndFeel = UIManager.getSystemLookAndFeelClassName();
try {
if (darkModeEnabled) {
// set laf of swing components
UIManager.setLookAndFeel(defaultLookAndFeel);
// use default css file for javafx components
this.fxPanel.getScene().getStylesheets().remove(0);
} else {
// set laf of swing components
UIManager.setLookAndFeel(darkLookAndFeel);
// use app.css file for javafx components
this.fxPanel.getScene().getStylesheets().add(0, getClass().getResource("app.css").toExternalForm());
}
} catch (IllegalAccessException | InstantiationException | UnsupportedLookAndFeelException | ClassNotFoundException e) {
e.printStackTrace();
}
triggerSwingComponentUpdate();
}
private static void triggerSwingComponentUpdate() {
SwingUtilities.invokeLater(() -> {
for (final Window w : Window.getWindows()) {
SwingUtilities.updateComponentTreeUI(w);
}
});
}
Комментарии:
1. Значит, это работает для изменения L amp; F взад и вперед во время выполнения?
2. Да, приведенный выше код представляет собой действие нажатия кнопки on. Каждый щелчок изменяет L amp; F. Просто установите LAF с помощью UIManager.setLookAndFeel(); а затем запустите повторный запуск всех компонентов Swing с помощью SwingUtilities.updateComponentTreeUI, как указано в документе oracle: docs.oracle.com/javase/tutorial/uiswing/lookandfeel /…
3. Отлично, я попробую это