首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NetBeans平台:如何以编程方式对基于Swing的GUI组件进行样式设计?

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

Stack Overflow用户
提问于 2021-01-13 09:16:55
回答 2查看 387关注 0票数 0

简介

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

问题

虽然我很清楚如何(通过CSS文件)对JFX组件进行样式设计,但是CSS文件不会对NetBeans平台的组件产生影响,比如菜单栏,因为它们是基于Swing的。例如,场景对象中的JavaFX组件具有黑色的样式,但是NetBeans菜单栏仍然很轻。

问题

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-13 18:33:22

在这个平台中(至少在我使用的NB12中)有一个名为FlatDarkLaf的嵌入式暗LAF,它看起来很漂亮。

为了使用它,需要在validate()子类的ModuleInstall方法中添加以下代码,以便在启动过程中尽早完成。

代码语言:javascript
复制
NbPreferences.root().node("laf").put("laf", "com.formdev.flatlaf.FlatDarkLaf");
UIManager.installLookAndFeel(new UIManager.LookAndFeelInfo("FlatLaf Dark", latDarkLaf.class.getName()));  

要切换回默认主题,请执行以下操作:

代码语言:javascript
复制
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。

票数 2
EN

Stack Overflow用户

发布于 2021-01-19 06:35:04

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

代码语言:javascript
复制
    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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65698853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档