当前位置: 首页 > 知识库问答 >
问题:

JavaFX-无法加载外部CSS主题

龙隐水
2023-03-14
- Root Project Folder
    - /data
    - /themes
        - /Theme.css
    - /src
        - sample
            - /Main.java
            - /Controller.java
            - /sample.fxml

我拼凑了一个示例项目来说明我的问题。

main.java:

package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Hello World");

        Scene scene = new Scene(root, 300, 275);

        scene.getStylesheets().add(
            getClass().getResource("/themes/Theme.css").toExternalForm());

        primaryStage.setScene(scene);
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}

sample.fxml:

<GridPane fx:controller="sample.Controller"
          xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
</GridPane>
Caused by: java.lang.NullPointerException
    at sample.Main.start(Main.java:18)
scene.getStylesheets().add("file:///themes/Theme.css");
scene.getStylesheets().add("file:///../themes/Theme.css");
File css = new File("themes/Theme.css");
scene.getStylesheets().add("file:///" + css.getAbsolutePath());
WARNING: Resource "file:////[PATH TO PROJECT]/themes/Theme.css" not found

错误中显示的完整路径完全正确,并指向确实存在的文件。

我该如何排除故障呢?由于它在示例项目中运行良好,但在我较大的项目中却不行,所以问题显然出在我的其他项目代码中的某个地方。

但是为什么编译器会告诉我一个文件不存在,而它明明存在呢?

共有1个答案

齐俊达
2023-03-14

在@james_d对原始问题的注释之后,我可以使用以下代码来处理这个问题,将字符串转换为URI以获得正确的格式。

我不想将CSS文件捆绑在JAR中,因为我希望我的用户能够自定义这些文件并添加他们自己的文件。

解决方案:

        scene.getStylesheets().clear();

        File css = new File("themes/" + Settings.getThemeName() + ".css");
        System.out.println(css.toString());
        File fontFile = new File("themes/Font.css");

        scene.getStylesheets().addAll(
                css.toURI().toString(),
                fontFile.toURI().toString());
 类似资料:
  • 当查看JavaFX SceneBuilder时,它能够加载任何类型的FXML。则忽略根节点或控制器。scenebuilder能够加载任何类型的fxml并显示其组件。 有没有人想要一种方法来加载一个fxml,而不考虑其字段的ID、控制器或根节点的类型? 问题是,当我尝试加载任何fxml时,它只能加载,如果我设置了正确的根类型。我想(通过FileChooser)将我能找到的任何FXML加载到(比方说)

  • 我正在尝试集成联邦快递API并得到这个错误。 警告:SoapClient::SoapClient()[SoapClient.SoapClient]:I/O警告:无法加载测试中的外部实体“./wsdl/RateService_v13.wsdl”。php在线12 致命错误:未捕获SoapFault异常:[WSDL]SOAP-ERROR:解析WSDL:无法从'.../wsdl/RateService_v

  • 我在从控制器加载javaFX中的图像时遇到了一些麻烦。 我把一些图像放在src/文件夹中,甚至放在img/文件夹中,但仍然得到“无效URL或未找到资源”。 但我无法检索图像“java.lang.IllegalArgumentException:无效URL或未找到资源” 谢谢你的帮助

  • 问题内容: 是否可以通过内联CSS加载外部字体? 注意:我 不是 在谈论使用带有定义的外部CSS文件,而是类似以下内容: 问题答案: 是否可以使用内嵌CSS加载外部字体?不适用于外部CSS文件[....]。 是的,您可以按照Stephen Scaff的本文中的文章所示对base64字体进行编码,然后将其放到页面的块中,以避免外部请求。 也可以按照您所描述的浏览器是否支持的方式使用此技术。 每个现代

  • 我无法从亚马逊S3桶加载雪花中的外部表。外部表创建成功,但在运行select命令时,不会返回任何内容。奇怪的是COPY into命令对雪花中的同一个表起作用。 谢谢,纳维德

  • 我的Netbeans在早些时候使用jdk 1.8.0.65时工作正常,但由于某些原因,我丢失了数据,我安装了jdk 1.8.0.73,现在我的Netbeans上的每个程序都显示了以下错误: 运行:错误:无法找到或加载主类序列。序列C:\Users\owais\AppData\Local\NetBeans\Cache\8.1\executor snippets\run。xml:53:Java返回:1