NetBeans平台:如何以编程方式设计基于Swing的GUI组件的样式?

hivapdat  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(109)

简介

我必须使用NetBeans平台和JavaFX 11编写胖客户端。其中一个要求是为应用程序提供默认的深色主题。因此,如果应用程序的用户按下深色模式按钮,应用程序的GUI必须使用深色主题。

问题

虽然如何设置JFX组件的样式(通过CSS文件)对我来说很明显,但CSS文件不会对NetBeans平台的组件(如菜单栏)产生影响,因为它们是基于Swing的。例如,场景对象中的JavaFX组件的样式为深色,但NetBeans菜单栏仍然为浅色。

问题

如何以编程方式更改NetBeans平台组件的样式(就像您在Web开发中使用CSS或在JavaFX中使用CSS支持一样)?

lzfw57am

lzfw57am1#

平台中有一个嵌入式暗LAF(至少在我使用的NB 12中),名为FlatDarkLaf,它看起来不错。
为了使用它,您需要在ModuleInstall子类的validate()方法中添加以下代码,以便在启动过程中尽早完成。

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不重新启动。
要获得更完整的示例代码,请查看UISettings Netbeans模块中GitHub上的应用程序JJazzLab-X。

针对Netbeans 12.5进行编辑

不需要调用installLookAndFeel(),更新NbPreferences就足够了。
用于更新NbPreferences的模块还应依赖于非APINetbeans平台模块FlatLaf Look and Feel
如果您的Netbeans平台应用程序使用Netbeans品牌(例如自定义图标和闪屏),它会在您的品牌目录中创建frame.gif等文件。但在运行时,如果您运行FlatDarkLaf等暗主题,Netbeans会希望将图标命名为frame_dark.gif,因此您应该重命名它们。有关详细信息,请参阅ImageUtilities.loadImage()的javadoc。

fzwojiic

fzwojiic2#

为了完整起见,我添加了解决问题的代码片段:

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);
            }
        });
    }

相关问题