2015-01-28 4 views
0

В настоящее время я пытаюсь создать программу просмотра изображений с помощью java и окна FXML. У меня была своя скрипка - знакомство с FXML и доступ к ним из программы, а также возможность получить кнопки для исчезновения и повторного появления - но при адаптации указанного кода для этого зрителя изображений я обнаружил, что панель FXML не будет открываться при запуске файл. Ошибок/предупреждений нет, кроме предупреждений о (пока) неиспользуемых библиотеках. При запуске нет сообщений об ошибках, нет текстовых полей и нет выходов на терминал, поэтому я ничего не могу предоставить оттуда. Код выглядит следующим образом:Получение окна FXML при запуске java-файла

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 

ответ

2

Справочная информация

@ n otation используется в JavaFX для указания relative location, который предположительно расположен по пути относительно текущего файла FXML.

Что Wrong

заряжается 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(); 

загрузчик будет иметь возможность разрешить относительную опорную т o ваш файл изображения.

Проверьте структуру каталогов и результат сборки

Это может или не может быть проблемой для вас.

Вы указываете изображение с помощью местоположения спецификатор:

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

Который говорит FXMLLoader искать Picture1.png в том же месте, он получил в FXML от; например если вы загрузили FXML из файловой системы, изображение будет находиться в одной и той же папке в файловой системе как FXML - аналогично, если вы загрузите FXML из банки, изображение должно быть на том же пути в банке, что и ваш FXML из.

Вы указываете, что разместили свое изображение по адресу: WorkspaceA/Practice1/scr/practice1/Picture1.png. Я не уверен, что это за место, но если это то же место, что и ваш источник MainProgram.java, ваш MyController.java source, WindowPanel.fxml, и если ваша система сборки настроена на копирование изображения и fxml в каталог для компиляции и упаковки, тогда он будет работать нормально - если это не так, вам нужно будет переместить изображение в соответствующее исходное местоположение ,

Смежные вопросы