简介
我必须使用NetBeans平台和JavaFX 11编程一个胖客户端。其中一个要求是为应用程序提供一个默认的和黑暗的主题。因此,如果应用程序的用户按下暗模式按钮,应用程序的GUI必须使用暗主题。
问题
虽然我很清楚如何(通过CSS文件)对JFX组件进行样式设计,但是CSS文件不会对NetBeans平台的组件产生影响,比如菜单栏,因为它们是基于Swing的。例如,场景对象中的JavaFX组件具有黑色的样式,但是NetBeans菜单栏仍然很轻。
问题
如何能够以编程方式更改NetBeans平台组件的样式(就像您在web开发中使用CSS或JavaFX中的CSS支持一样)?
发布于 2021-01-13 18:33:22
在这个平台中(至少在我使用的NB12中)有一个名为FlatDarkLaf的嵌入式暗LAF,它看起来很漂亮。
为了使用它,需要在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而不重新启动。
要获得更完整的示例代码,请查看我在GitHub上的应用程序JJazzLab,它位于UISettings Netbeans模块中。
用于Netbeans 12.5的编辑
不需要调用installLookAndFeel(),更新NbPreferences就足够了。
更新NbPreferences的模块还应该依赖于非API Netbeans平台模块FlatLaf Look and Feel。
如果您的Netbeans平台应用程序使用Netbeans品牌(用于ex )。要自定义图标和启动屏幕),它会在您的品牌目录中创建诸如frame.gif之类的文件。但是在运行时,如果您运行一个像FlatDarkLaf这样的黑暗主题,Netbeans将期望该图标被命名为frame_dark.gif,因此您应该重新命名它们。有关更多信息,请参见ImageUtilities.loadImage()的javadoc。
发布于 2021-01-19 06:35:04
为了完整起见,我添加了解决问题的代码片段:
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);
}
});
}https://stackoverflow.com/questions/65698853
复制相似问题