如何在 JavaFX 9+ 应用程序中设置全局 CSS?

Eva*_*van 7 java javafx java-9

关于 SO 有几个问题,但是由于 JPMS 支持没有任何答案是有效的。

方法 1:JavaFX - 为整个应用程序设置默认 CSS 样式表

Application.setUserAgentStylesheet(Application.STYLESHEET_MODENA);
StyleManager.getInstance().addUserAgentStylesheet(getClass().getResource("/style.css").toString());
Run Code Online (Sandbox Code Playgroud)

不起作用,因为StyleManager成为私有 API 的一部分,JavaFX 不导出它。

方法二:/sf/answers/3570210591/

@import "com/sun/javafx/scene/control/skin/modena/modena.css";
/* rest of CSS code */
Run Code Online (Sandbox Code Playgroud)

不起作用,因为modena.css成为私有 API 的一部分,JavaFX 不导出它。

方法 3:将 CSS 设置为顶部父节点(/sf/answers/2021629501/

不起作用,因为 CSS 不会应用于模态窗口。

Dav*_*vis 1

Scene通过调用的方法将样式表应用到场景getStylesheets()。这就是我的应用程序在运行时改变整个应用程序外观的方式:

 private void applyStylesheets(
    final Scene scene, final String internal, final File external ) {
    final var stylesheets = scene.getStylesheets();
    stylesheets.clear();
    stylesheets.add( STYLESHEET_APPLICATION_BASE );
    stylesheets.add( STYLESHEET_MARKDOWN );
    stylesheets.add( getStylesheet( toFilename( internal ) ) );

    try {
      if( external != null && external.canRead() && !external.isDirectory() ) {
        stylesheets.add( external.toURI().toURL().toString() );
        mFileWatchService.register( external );
      }
    } catch( final Exception ex ) {
      clue( ex );
    }
  }
Run Code Online (Sandbox Code Playgroud)

该代码正在执行以下操作:

  1. 从 中获取对当前样式表的引用Scene
  2. 清除现有样式表列表。
  3. 添加基本​​样式表、富文本编辑器样式表,然后添加用户选择的样式表。
  4. 添加外部来源的样式表以及其他覆盖。
  5. (可选)在外部来源的样式表上添加监视,以便在文件发生更改时,UI 会立即更新。

有关上下文和更多详细信息,请参阅完整的代码片段。