运行java文件时打开FXML窗口

时间:2015-01-28 22:20:48

标签: java fxml

我目前正在尝试使用java和FXML窗口构建图片查看程序。我有一个小提琴 - 了解FXML并从程序中访问它们并且能够让按钮消失并重新出现 - 但是在为这个图片查看器调整所述代码后,我发现FXML面板在运行时无法打开文件。除了(尚未)声明未使用的库之外,没有任何错误/警告。启动时,终端没有错误信息,没有文本框和输出,所以我无法从那里提供任何东西。代码如下:

package practice1;

import javafx.application.Application;
import javafx.stage.Stage;
import java.io.IOException;
import javax.imageio.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.io.*;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.*;
import javafx.scene.image.ImageView;
import javafx.scene.image.*;
import java.awt.image.BufferedImage;

public class MainProgram extends Application{


    public void start(Stage stage) {



        try {

            FXMLLoader fxmlLoader = new FXMLLoader();
            String viewerFxml = "WindowPanel.fxml";
            AnchorPane page = (AnchorPane)fxmlLoader.load(
                    this.getClass().getResource(viewerFxml).openStream());
            Scene scene = new Scene(page);
            stage.setScene(scene);
            stage.show();

        } catch (IOException ex) {
            Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, ex);
            System.exit(1);
        }
    }

    public static void main(String args[]) {
        launch(args);
            System.exit(0);
        }
    }

FXML如下:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.text.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="practice1.MyController">
   <children>
      <Button fx:id="TurnLeft" layoutX="113.0" layoutY="353.0" mnemonicParsing="false" onAction="#hide1" text="Turn Left" />
      <Button fx:id="TurnRight" layoutX="237.0" layoutY="353.0" mnemonicParsing="false" onAction="#hide2" text="Turn Right" />
      <ToolBar prefHeight="40.0" prefWidth="600.0">
        <items>
            <MenuButton mnemonicParsing="false" text="Pick Up">
              <items>
                <MenuItem mnemonicParsing="false" text="Action 1" />
                <MenuItem mnemonicParsing="false" text="Action 2" />
              </items>
            </MenuButton>
            <MenuButton mnemonicParsing="false" text="Drop">
              <items>
                <MenuItem mnemonicParsing="false" text="Action 1" />
                <MenuItem mnemonicParsing="false" text="Action 2" />
              </items>
            </MenuButton>
        </items>
      </ToolBar>
      <Button fx:id="proceed" layoutX="178.0" layoutY="315.0" mnemonicParsing="false" onAction="#changeImage" text="Proceed" />
      <ImageView fx:id="mainImage" fitHeight="259.0" fitWidth="426.0" layoutY="40.0" pickOnBounds="true" preserveRatio="true">
         <image>
            <Image url="@Picture1.png" />
         </image></ImageView>
      <Text layoutX="436.0" layoutY="60.0" strokeType="OUTSIDE" strokeWidth="0.0" text="You have" />
      <Text layoutX="436.0" layoutY="86.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Object1" />
      <Text layoutX="436.0" layoutY="111.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Object2" />
      <Text layoutX="436.0" layoutY="139.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Object 3" />
      <ImageView fx:id="SmallImage2" fitHeight="89.0" fitWidth="117.0" layoutX="266.0" layoutY="45.0" pickOnBounds="true" preserveRatio="true" />
      <ImageView fx:id="SmallImage3" fitHeight="89.0" fitWidth="117.0" layoutX="266.0" layoutY="142.0" pickOnBounds="true" preserveRatio="true" />
      <ImageView fx:id="SmallImage1" fitHeight="89.0" fitWidth="117.0" layoutX="152.0" layoutY="45.0" pickOnBounds="true" preserveRatio="true" />
   </children>
</AnchorPane>

文件“Picture1.png”位于工作空间中,位置为:

WorkspaceA/Practice1/scr/practice1/Picture1.png

1 个答案:

答案 0 :(得分:2)

<强>背景

JavaFX中使用@表示法来指定relative location,假设它位于相对于当前FXML文件的路径上,并且#34;

什么是错误的

使用以下代码将FXML加载为流:

 AnchorPane page = (AnchorPane)fxmlLoader.load(
     this.getClass().getResource(viewerFxml).openStream());

蒸汽不是位置,因此没有相对于流的位置概念。

如果我在本地运行你的应用程序,我会得到一个无法找到图片文件的堆栈跟踪(这里只是它的最后一部分):

Caused by: java.lang.IllegalArgumentException: Invalid URL or resource not found
at javafx.scene.image.Image.validateUrl(Image.java:1081)
... 18 more

如何修复

在加载FXML之前在加载器中设置位置:

fxmlLoader.setLocation(getClass().getResource(viewerFxml));
AnchorPane page = fxmlLoader.load();

然后,加载程序将能够解析对图片文件的相对引用。

检查目录结构并构建输出

这对您来说可能是也可能不是问题。

使用位置说明符指定图像:

<Image url="@Picture1.png" />

告诉FXMLLoader在它获得FXML的同一位置寻找Picture1.png;例如如果您从文件系统加载FXML,图像将与FXML位于文件系统的同一文件夹中 - 类似地,如果您从jar加载FXML,则图像应位于jar中与检索FXML时相同的路径从。

您声明您将照片放在:WorkspaceA/Practice1/scr/practice1/Picture1.png。我不知道那个位置是什么,但是如果它与MainProgram.java源相同,你的MyController.java源,WindowPanel.fxml,如果你的构建系统被设置为将图像和fxml复制到编译和打包目标目录,然后它将正常工作 - 如果不是,您将需要将图像移动到适当的源位置。