【问题标题】:adding css file to stylesheets in javafx将css文件添加到javafx中的样式表
【发布时间】:2020-10-18 08:50:45
【问题描述】:

语言:JavaFX

IDE:Netbeans

问题:我正在尝试将 css 文件添加到样式表,但以下代码的第一行总是生成 NullPointerException

String css = this.getClass().getResource("double_slider.css").toExternalForm(); 
scene.getStylesheets().add(css);

我尝试用完整路径替换“double_slider.css”。 double_slider.css 当前位于与进行此调用的类相同的包中。我还尝试了在http://introjava.wordpress.com/2012/03/21/linking-a-css-style-sheet-to-javafx-scene-graph/ 找到的所有变体,但没有成功。清理和构建也无济于事。

如果我将 css 文件放在转储 .class 文件的构建文件夹中,NullPointerException 就会消失。但随后 css 文件无法正常工作,因为它引用了我项目中的其他文件。

【问题讨论】:

  • 您的应用是如何构建、部署和执行的?

标签: css stylesheet javafx


【解决方案1】:

把你的yourname.css文件直接放在src目录下。

scene.getStylesheets().add("yourname.css")

需要清理和构建

【讨论】:

  • 我觉得放在子目录下会更漂亮更清晰。不直接在/src下@
【解决方案2】:

我认为您缺少导致无法找到 CSS 文件的斜杠。尝试更正您的路径参考。

例如:

-root
--app/Main.java
--assets/double_slider.css

应该是:

String css = this.getClass().getResource("/assets/double_slider.css").toExternalForm();

【讨论】:

  • 为什么我们需要使用 toExternalForm();最后的方法?
  • @UnKnown node.getStylesheets().add() 不接受 URL 对象作为参数。 toExternalForm() 将其表示为字符串。
  • 来自 JavaDoc:“[path] 的任何前导 '/' 字符都将被忽略,并且 [path] 被视为相对于应用程序类路径的根的路径。”
  • 什么是“根”?是'src'目录吗?
  • 您始终可以使用System.getProperty("user.dir"); 来检查应用程序从哪个目录运行......当deploying 应用程序到目标设备时,这将很方便,以确保您始终拥有正确的使用您的资源路径到子目录。你可以在那里为不同的目的传递不同的字符串,但我不会为你谷歌
【解决方案3】:

我遇到了同样的问题。我在 Win7 上使用 NetBeans 7.3 和 JavaFX 2.2.7、JDK 7.0_21。

我的解决方案是将 .css 放在 SAME 文件夹中,作为包含 void start(Stage stage) 的 Java 文件。所以项目视图看起来像这样:

  • 项目名称
    • 源包
      • pkg随便
        • Main.java
        • MyCssFile.css

(所以 CSS 文件是 IN 包,我觉得它真的很奇怪和约束。一些文档告诉我将它放在项目的根目录中,以便可以在运行时找到它,但是这在 NB 中对我不起作用。无论我是否通过点击 Ctrl+ 启动包含“start(..)”的文件,我的应用程序现在都会运行U 或单击项目上下文菜单上的运行。我是否让 NB 将所有内容放入 JAR 都没有关系。)

这是在上述情况下加载 CSS 的代码:

  URL url = this.getClass().getResource("controlStyle1.css");
    if (url == null) {
        System.out.println("Resource not found. Aborting.");
        System.exit(-1);
    }
    String css = url.toExternalForm(); 
    scene.getStylesheets().add(css);

这不起作用:

    scene.getStylesheets().add("controlStyle1.css");

希望这会有所帮助。

【讨论】:

  • 你可以读到“如何确定 java 运行时路径”,我总是有一个单独的资产文件夹用于开发时间加载和一个用于部署时间加载。提示:正如我在上面的评论中所说,在 IDE 和 JAR 文件中尝试一次 System.getProperty("user.dir") 并查看差异
【解决方案4】:

我遇到了同样的问题(在 NetBeans 8 中)。我在这里找到了解决方案:https://blog.idrsolutions.com/2014/04/use-external-css-files-javafx/

我的资源文件电子表格.css 在这里:

MyApp
-resources
--spreadsheet.css
-source packages
--fr.ccc.myapp.view
---mainView.java
---FXMLMain.fxml

在 mainView.java 中:

File f = new File("resources/spreadsheet.css");
spreadsheet.getStylesheets().add("file:///" + f.getAbsolutePath().replace("\\", "/"));

希望这会有所帮助。

【讨论】:

    【解决方案5】:

    所有答案都缺少一个非常重要的部分,那就是 css 文件名称前的“/”:

    文件夹结构:

    src
      resources
        stylesheet.css
    

    像这样加载它,注意css文件之前的起始斜杠

    scene.getStylesheets().add(getClass().getResource("/stylesheet.css").toExternalForm())
    

    【讨论】:

      【解决方案6】:

      考虑您的旧代码:

      String css =this.getClass().getResource("double_slider.css").toExternalForm(); 
      scene.getStylesheets().add(css);
      

      尝试将其更改为这个新代码,它会起作用:

      screen.getStylesheets().add(getClass().getResource("double_slider.css").toExternalForm());
      

      使用getClass()时,不需要使用this关键字。

      我希望这对你有用。 :)

      【讨论】:

        【解决方案7】:

        您可以将 style.css 直接添加到 .fxml 文件中作为根元素的属性,如 stylesheets="@your_relative_path/style.css"。

        如果要访问 src 文件夹中的 css 文件,可以使用 @../style.css

        【讨论】:

          【解决方案8】:

          这很简单。

          this.scene.setUserAgentStylesheet(/resources/blabla.css);
          

          这对我有用-

          【讨论】:

            【解决方案9】:

            嗯,你在 Netbeans 上吗?尝试“清理并构建”项目。

            【讨论】:

            • 是的,我正在使用 Netbeans。我已经多次尝试“清理并构建”,但并没有解决问题。
            • @Danielle。以下哪一行会生成 NullPointerException:1) String css = this.getClass().getResource(“double_slider.css”).toExternalForm(); 2) scene.getStylesheets().add(css);。如果仍处于第二阶段,那么您需要提供更多详细信息。或者,在 Netbeans 中创建一个新的小项目,然后在其中重试加载您的 css 文件。
            • NullPointerException 由第一行生成。
            • 我也知道 Netbeans 可以找到该文件。我使用以下代码进行了检查,其中 path 是 css 文件的完整路径: File f = new File(path); if(f.exists()) {System.out.println("文件存在。");}
            • 即便如此,我还是坚持让你在 Netbeans 中创建一个新的小项目,然后重试在那里加载你的 css 文件。
            【解决方案10】:

            你在设置样式表之前初始化了场景对象吗?

            scene = new Scene(myRootLayout, 600, 600); // 例如

            【讨论】:

            • 是的,场景已初始化。
            • 我在使用 CSS 时遇到了类似的问题,我很难记住哪里出了问题。初始化场景是引发空指针异常的一种方法。
            • 你上面的代码是直接从你的源代码中粘贴过来的吗? double_slider.css 周围的引号看起来很尴尬。你能试着重新输入那些引号吗?可能是一个奇怪的建议。代码对我来说似乎是正确的。
            • 如果您没有成功,请尝试将项目复制/粘贴到javadesk.co/css/javaFXCssIntro.html。有一个 java 文件和两个 css 文件要复制到您的项目中。
            • 你的问题解决了吗?
            【解决方案11】:

            在你的文件 .java 中使用这个

            Application.setUserAgentStylesheet(getClass().getResource("application.css")
                            .toExternalForm());
            

            【讨论】:

              【解决方案12】:

              Folder Structure

              在 MedicalLibraryFx.java 中

              scene.getStylesheets().add(getClass().getResource("/css/style.css").toString()); 
              

              Folder structure when css is in the same directory as controller

              scene.getStylesheets().add(getClass().getResource("style.css").toString());
              

              【讨论】:

                【解决方案13】:

                假设文件结构是这样的:
                -root
                --src
                ---资源
                ----double_slider.css
                ---包装
                ----JavaFXFile.java

                这对我有用:

                scene.getStylesheets().add((new File("src/resources/double_slider.css")).toURI().toString());
                

                【讨论】:

                  【解决方案14】:
                  scene.getStylesheets().add("file:///home/fullpathname/file.css");
                  

                  scene.getStylesheets().add("file:/home/fullpathname/file.css");
                  

                  但之后:

                  运行/清理并构建项目

                  为我工作

                  NetBeans IDE 8.2 ; Java:1.8.0_201;Linux 16.04

                  【讨论】:

                    【解决方案15】:

                    尝试将“@”作为文件名。它对我有用。

                    例如: '@main.css'

                    【讨论】:

                      【解决方案16】:

                      我做了一个小的登录示例,这就是我如何链接我的 styleshet.css

                      @Override
                      public void start(Stage stage) throws Exception {
                          Parent root = FXMLLoader.load(getClass().getResource("LoginUI.fxml"));
                      
                      
                          Scene scene = new Scene(root);
                      
                          scene.getStylesheets().add(JavaFXLogin.class.getResource("stylesheet.css").toExternalForm());
                      
                          stage.setScene(scene);
                          stage.show();
                      
                      }
                      

                      您可以使用此代码行来链接您的 css 文件。但 css 文件应该在你的包中。

                      scene.getStylesheets().add(JavaFXLogin.class.getResource("stylesheet.css").toExternalForm());

                      【讨论】:

                        【解决方案17】:

                        在 maven 项目中,您必须在 javafx-plugin 部分的 file.pom 中定义资源的路径:如下所示:

                        <configuration>
                            <mainClass>com.personale.ciaomondo.App</mainClass>
                                  <resources>          
                                    <resource>
                                      <directory>src/main/resources</directory>
                                    </resource>
                                  </resources>
                        </configuration>
                        

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 2013-04-20
                          • 2013-12-08
                          • 1970-01-01
                          • 2012-07-12
                          • 1970-01-01
                          • 1970-01-01
                          • 2019-07-17
                          • 1970-01-01
                          相关资源
                          最近更新 更多