在运行时中找不到Scene Builder中的连接样式

时间:2018-11-14 21:58:13

标签: styles scenebuilder gluon

我在Scene Builder for Java 8中创建了Pane。我的.css文件存储在/rescouces/css/app.css中。我在Scene Builder中连接样式表,一切正常。但是,当我启动我的应用程序后,我得到了异常错误: Caused by: javafx.fxml.LoadException: Invalid resource: /../style/app.css not found on the classpath

如何解决此问题?我每次都需要重命名css.fxml的路径吗?

enter image description here

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="912.0" prefWidth="1368.0" styleClass="app" stylesheets="@/style/app.css" xmlns="http://javafx.com/javafx/8.0.172-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.mypod.tablet.controller.MainController">
    <children>
        <AnchorPane fx:id="contentPane" layoutX="248.0" layoutY="138.0" stylesheets="@/style/content.css" AnchorPane.bottomAnchor="94.0" AnchorPane.leftAnchor="250.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="115.0">
            <styleClass>
                <String fx:value="block" />
                <String fx:value="content-block" />
            </styleClass>
        </AnchorPane>
    </children>
</AnchorPane>

加载fxml:

FXMLLoader loader = new FXMLLoader();

this.primaryStage.setScene(new Scene(loader.load(Util.getResource("/fxml/main.fxml"))));

1 个答案:

答案 0 :(得分:1)

问题

为了重现该问题,并根据对该问题的评论,这是必需的:

主班

@Override
public void start(Stage stage) throws Exception {
    FXMLLoader loader = new FXMLLoader();
    Parent root = loader.load(MainApp.class.getClassLoader().getResourceAsStream("fxml/scene.fxml"));

    Scene scene = new Scene(root);
    stage.setScene(scene);
    stage.show();
}

src/main/resources/fxml/scene.fxml下的FXML:

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane id="AnchorPane" stylesheets="@../styles/styles.css" prefHeight="200" prefWidth="320" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
    <children>
        <Button fx:id="button" text="Click Me!" />
    </children>
</AnchorPane>

src/main/resources/styles/styles.css下的CSS

.button {
    -fx-font-size: 2em;
}

该项目正在运行,但您得到此错误打印:

null/../styles/styles.css
com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged
WARNING: Resource "../styles/styles.css" not found.

手动编辑FXML文件并删除父点时:

stylesheets="@/styles/styles.css"

似乎可以解决问题,并且可以在没有警告的情况下正常运行,这会阻止Scene Builder查找css文件,因此不应该这样做。

解决方案

  • 不建议使用getResourceAsStream来检索FXML文件,只需使用getResource()

这有效:

FXMLLoader loader = new FXMLLoader();
Parent root = loader.load(MainApp.class.getClassLoader().getResource("fxml/scene.fxml"));
  • 不建议使用FXMLLoader空构造函数,而应使用静态load方法。

这有效:

Parent root = FXMLLoader.load(MainApp.class.getClassLoader().getResource("fxml/scene.fxml"));
  • 最后,不需要类加载器。该类加载器是基于流的,它不知道您从中检索类并试图从包"fxml/scene.fxml"中进行定位的类。另一方面,Class.getResource()是基于URL的,它查找相对于类的资源,因此您需要将路径设置为项目"/fxml/scene.fxml"的根。

这是应该如何称呼的:

Parent root = FXMLLoader.load(MainApp.class.getResource("/fxml/scene.fxml"));

或者如果您需要加载程序(例如,检索控制器),这也是推荐的方法:

FXMLLoader loader = new FXMLLoader(MainApp.class.getResource("/fxml/scene.fxml"));
// YourController controller = (YourController) loader.getController();
Parent root = loader.load();

post值得一读。