图像未在编译时加载,但显示在SceneBuilder中

时间:2018-10-17 11:10:57

标签: java css fxml

因此,我正在使用JavaFX和FXML文件在Java中创建应用程序,而不是在Java中编写UI。添加该项目正在Gradle中进行。

我正在使用样式表来配置我的UI,但是在SceneBuilder中它的显示效果很好,但是在编译和运行代码后,样式表无法加载。

下面是我当前的文件结构(删除了一些内容)

src
`-- Main
    |-- java
    |   |-- Controller
    |   |   `-- mainWindowController.java
    |   `-- Main.java
    `-- resources
        |-- FXMLs
        |   `-- mainWindow.FXML
        |-- Pictures
        |   `-- image.png
        `-- stylesheet.css

下面是FXML文件调用样式表的部分。

<AnchorPane fx:id="BG" prefHeight="674.0" prefWidth="782.0" stylesheets="@../stylesheet.css" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.sony.TCOCalculator.Controller.mainWindowController">
   <children...> //Cut out this section
</AnchorPane>

现在编译时出现错误

Oct 17, 2018 11:53:21 AM com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged
INFO: Could not find stylesheet: file:/C:/Users/(username)/AppData/Local/Temp/stylesheet.css

我很困惑为什么会这样,更何况编译器为什么要在我的temp文件夹中查找样式表。尝试查看图像时会发生相同的问题,该图像在Scenebuilder中有效,但在运行时不会很快。

下面是我主要的FXML文件调用位置。

public class Main extends Application
{
    private static final String mainWindow = "FXMLs/mainWindow.fxml";
    private static final String mainIcon = "Pictures/mainIcon.ico";
    private static final Logger logger = LogManager.getLogger(Main.class.getName());

    public static void main(String[] args)
    {
        logger.debug("Main class has started");
        launch(args);
    }

    @Override
    public void start(Stage primaryStage)
    {
        try
        {
            File mainScene = openFile(mainWindow,true);
            if (mainScene != null)
            {
                FXMLLoader sceneLoader = new FXMLLoader(mainScene.toURI().toURL());

                Parent root = sceneLoader.load();
                root.getStylesheets().add("stylesheet.css");

                mainWindowController controller = sceneLoader.getController();
                logger.info("{} retrieved successfully", controller);
                logger.info("{} loaded successfully", mainWindow);

                if (root != null)
                {
                    Scene scene = new Scene(root);
                    primaryStage.setScene(scene);
                    primaryStage.setTitle("TCO Calculator by Sony");
                    primaryStage.setResizable(false);
                    primaryStage.getIcons().add(new Image(mainIcon));
                    primaryStage.setOnHidden(event ->
                    {
                        controller.shutdown();
                        Platform.exit();
                    });
                    primaryStage.show();
                }
                else
                    logger.error("Could not open main scene");
            }
        }

        catch (Exception e)
        {
            logger.error("File does not exist", e);
            Platform.exit();
        }
    }

您会注意到我在Main Java代码中手动添加了样式表,但这只是一个变通方法,直到我真正解决了问题。我的图片有很多问题,我更喜欢将它们添加到FXML文件而不是Java代码中,因此删除变通方法并使用.FXML加载这些内容将是一个更好的选择。 / p>

OpenFile方法如下:

 public static File openFile(String path, boolean resource)
    {
        InputStream inFromFile;
        try
        {
            if (resource)
                inFromFile = ClassLoader.getSystemClassLoader().getResourceAsStream(path);

            else
                inFromFile = new FileInputStream(path);

            if (inFromFile == null)
            {
                return null;
            }

            File tempFile = File.createTempFile(String.valueOf(inFromFile.hashCode()), ".tmp");
            tempFile.deleteOnExit();

            try(FileOutputStream tempWriter = new FileOutputStream(tempFile))
            {
                //copy stream
                byte[] buffer = new byte[1024];
                int bytesRead;
                while((bytesRead = inFromFile.read(buffer)) != -1)
                {
                    tempWriter.write(buffer, 0, bytesRead);
                }
            }
            return tempFile;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return null;
        }
    }

0 个答案:

没有答案