2015-06-30 3 views
1

Я уже искали самые глубокие глубины межсети, но никакого ответа не будет, похоже, нашли -.-«FXMLLoader.constructLoadException» при попытке запуска Java FX приложения

Проблема заключается в моей JavaFX программе я хочу написать , Но я не могу сделать это дальше добавления класса контроллера. Я следовал почти каждому учебнику, который мог найти, но проблема все еще остается мне неизвестной.

Это исключение:

javafx.fxml.LoadException: 
/U:/BankingSolutions/MediaCenterFX/bin/main/ressources/view/MainUI.fxml:12 

at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2617) 
at javafx.fxml.FXMLLoader.access$700(FXMLLoader.java:104) 
at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:927) 
at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:976) 
at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:216) 
at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:738) 
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2723) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3230) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3191) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3164) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3140) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3120) 
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3113) 
at application.Main.start(Main.java:15) 
at com.sun.javafx.application.LauncherImpl$8.run(LauncherImpl.java:837) 
at com.sun.javafx.application.PlatformImpl$7.run(PlatformImpl.java:335) 
at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:301) 
at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:298) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.javafx.application.PlatformImpl$6.run(PlatformImpl.java:298) 
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) 
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
at com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39) 
at com.sun.glass.ui.win.WinApplication$4$1.run(WinApplication.java:112) 
at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.ClassNotFoundException: /java/controllers/MainUIController 
at java.net.URLClassLoader$1.run(URLClassLoader.java:372) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:360) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:925) 
... 24 more 

и это код. Есть Автошоу классов: Main.class, мой MainUI.fxml, который я создал с помощью scenebuilder 2 и мой MainUIController.class, которые, очевидно, должны работать как контроллер mainuis

package application; 

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


public class Main extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     try { 
      AnchorPane root = (AnchorPane) FXMLLoader.load(getClass().getResource("/main/ressources/view/MainUI.fxml")); 
      Scene scene = new Scene(root); 
      primaryStage.setScene(scene); 
      primaryStage.show(); 

     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

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

_______________________________________________ 

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

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

<AnchorPane fx:id="root" prefHeight="1080.0" prefWidth="1920.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="/java/controllers/MainUIController"> 
    <children> 
     <BorderPane fx:id="borderPane01" layoutX="657.0" layoutY="304.0" prefHeight="336.0" prefWidth="403.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> 
     <bottom> 
      <AnchorPane fx:id="bp_bottom" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" /> 
     </bottom> 
     <left> 
      <GridPane fx:id="bp_left_grid" prefHeight="680.0" prefWidth="238.0" BorderPane.alignment="CENTER"> 
       <columnConstraints> 
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
       <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
       <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
       </columnConstraints> 
       <rowConstraints> 
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
       <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
       <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
       <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
       </rowConstraints> 
       <children> 
        <Button fx:id="btn_search" mnemonicParsing="false" prefHeight="48.0" prefWidth="172.0" text="Suche" GridPane.columnSpan="2147483647" GridPane.halignment="CENTER" GridPane.hgrow="ALWAYS" GridPane.valignment="CENTER"> 
        <GridPane.margin> 
         <Insets /> 
        </GridPane.margin> 
        <font> 
         <Font size="24.0" /> 
        </font> 
        </Button> 
        <Button fx:id="btn_series" mnemonicParsing="false" prefHeight="48.0" prefWidth="172.0" text="Serien" wrapText="true" GridPane.columnSpan="3" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="CENTER"> 
        <font> 
         <Font size="24.0" /> 
        </font> 
        </Button> 
        <Button fx:id="btn_download" mnemonicParsing="false" prefHeight="48.0" prefWidth="172.0" text="Download" GridPane.columnSpan="3" GridPane.halignment="CENTER" GridPane.rowIndex="3" GridPane.valignment="CENTER"> 
        <font> 
         <Font size="24.0" /> 
        </font> 
        </Button> 
        <Button fx:id="btn_movies" mnemonicParsing="false" prefHeight="48.0" prefWidth="172.0" text="Filme" wrapText="true" GridPane.columnSpan="3" GridPane.halignment="CENTER" GridPane.rowIndex="2" GridPane.valignment="CENTER"> 
        <font> 
         <Font size="24.0" /> 
        </font> 
        </Button> 
        <Button fx:id="btn_exit" mnemonicParsing="false" prefHeight="48.0" prefWidth="172.0" text="Beenden" GridPane.columnSpan="3" GridPane.halignment="CENTER" GridPane.rowIndex="6" GridPane.valignment="CENTER"> 
        <font> 
         <Font size="24.0" /> 
        </font> 
        </Button> 
        <Button fx:id="btn_settings" mnemonicParsing="false" prefHeight="48.0" prefWidth="172.0" text="Optionen" GridPane.columnSpan="3" GridPane.halignment="CENTER" GridPane.rowIndex="4" GridPane.valignment="CENTER"> 
        <font> 
         <Font size="24.0" /> 
        </font> 
        </Button> 
        <Button fx:id="btn_dashboard" mnemonicParsing="false" prefHeight="48.0" prefWidth="172.0" text="Dashboard" GridPane.columnSpan="3" GridPane.halignment="CENTER" GridPane.rowIndex="5" GridPane.valignment="CENTER"> 
        <font> 
         <Font size="24.0" /> 
        </font> 
        </Button> 

       </children> 
      </GridPane> 
     </left> 
     <top> 
      <AnchorPane fx:id="bp_top" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER"> 
       <children> 
        <Label fx:id="headlabel" alignment="CENTER" layoutX="737.0" layoutY="92.0" prefHeight="200.0" prefWidth="1920.0" text="Dashboard" textAlignment="CENTER" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> 
        <font> 
         <Font size="48.0" /> 
        </font> 
        </Label> 
       </children> 
      </AnchorPane> 
     </top> 
     <center> 
      <AnchorPane fx:id="bp_center" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" /> 
     </center> 
     <right> 
      <AnchorPane fx:id="bp_right" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" /> 
     </right> 
     </BorderPane> 
    </children> 
</AnchorPane> 

______________________________________________ 

package main.java.controllers; 

import java.net.URL; 
import java.util.ResourceBundle; 

import javafx.fxml.FXML; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.layout.AnchorPane; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.GridPane; 

public class MainUIController{ 

    @FXML // ResourceBundle that was given to the FXMLLoader 
    private ResourceBundle resources; 

    @FXML // URL location of the FXML file that was given to the FXMLLoader 
    private URL location; 

    @FXML // fx:id="btn_search" 
    private Button btn_search; // Value injected by FXMLLoader 

    @FXML // fx:id="btn_movies" 
    private Button btn_movies; // Value injected by FXMLLoader 

    @FXML // fx:id="btn_exit" 
    private Button btn_exit; // Value injected by FXMLLoader 

    @FXML // fx:id="btn_series" 
    private Button btn_series; // Value injected by FXMLLoader 

    @FXML // fx:id="bp_right" 
    private AnchorPane bp_right; // Value injected by FXMLLoader 

    @FXML // fx:id="bp_bottom" 
    private AnchorPane bp_bottom; // Value injected by FXMLLoader 

    @FXML // fx:id="borderPane01" 
    private BorderPane borderPane01; // Value injected by FXMLLoader 

    @FXML // fx:id="headlabel" 
    private Label headlabel; // Value injected by FXMLLoader 

    @FXML // fx:id="bp_left_grid" 
    private GridPane bp_left_grid; // Value injected by FXMLLoader 

    @FXML // fx:id="bp_top" 
    private AnchorPane bp_top; // Value injected by FXMLLoader 

    @FXML // fx:id="root" 
    private AnchorPane root; // Value injected by FXMLLoader 

    @FXML // fx:id="btn_download" 
    private Button btn_download; // Value injected by FXMLLoader 

    @FXML // fx:id="btn_dashboard 
    private Button btn_dashboard; // Value injected by FXMLLoader 

    @FXML // fx:id="bp_center" 
    private AnchorPane bp_center; // Value injected by FXMLLoader 

    @FXML // fx:id="btn_settings" 
    private Button btn_settings; // Value injected by FXMLLoader 

    @FXML // This method is called by the FXMLLoader when initialization is complete 
    void initialize() { 
     assert root   != null : "fx:id=\"root\" was not injected: check your FXML file 'MainUI.fxml'."; 
     assert borderPane01 != null : "fx:id=\"borderPane01\" was not injected: check your FXML file 'MainUI.fxml'."; 
     assert bp_top  != null : "fx:id=\"bp_top\" was not injected: check your FXML file 'MainUI.fxml'."; 
     assert headlabel != null : "fx:id=\"headlabel\" was not injected: check your FXML file 'MainUI.fxml'."; 
     assert bp_left_grid != null : "fx:id=\"bp_left_grid\" was not injected: check your FXML file 'MainUI.fxml'."; 
     assert bp_center != null : "fx:id=\"bp_center\" was not injected: check your FXML file 'MainUI.fxml'."; 
     assert bp_right  != null : "fx:id=\"bp_right\" was not injected: check your FXML file 'MainUI.fxml'."; 
     assert bp_bottom != null : "fx:id=\"bp_bottom\" was not injected: check your FXML file 'MainUI.fxml'."; 
     assert btn_search != null : "fx:id=\"btn_search\" was not injected: check your FXML file 'MainUI.fxml'."; 
     assert btn_series != null : "fx:id=\"btn_series\" was not injected: check your FXML file 'MainUI.fxml'."; 
     assert btn_movies != null : "fx:id=\"btn_movies\" was not injected: check your FXML file 'MainUI.fxml'."; 
     assert btn_download != null : "fx:id=\"btn_download\" was not injected: check your FXML file 'MainUI.fxml'."; 
     assert btn_settings != null : "fx:id=\"btn_settings\" was not injected: check your FXML file 'MainUI.fxml'."; 
     assert btn_dashboard!= null : "fx:id=\"dashboard\" was not injected: check your FXML file 'MainUI.fxml'."; 
     assert btn_exit  != null : "fx:id=\"btn_exit\" was not injected: check your FXML file 'MainUI.fxml'."; 

     btn_search.setOnAction(value -> { 
      System.out.println("Search pressed"); //TODO 
     }); 
     btn_series.setOnAction(value ->{ 
      System.out.println("series pressed"); 
     }); 
     btn_movies.setOnAction(value ->{ 
      System.out.println("movies pressed"); 
     }); 
     btn_download.setOnAction(value ->{ 
      System.out.println("download pressed"); 
     }); 
     btn_settings.setOnAction(value ->{ 
      System.out.println("settings pressed"); 
     }); 
     btn_dashboard.setOnAction(value ->{ 
      System.out.println("dashboard pressed"); 
     }); 
     btn_exit.setOnAction(value ->{ 
      System.out.println("exit pressed"); 
     }); 


    } 
} 

Edit: Вот моя структура пакета:

src 
|-application 
    |here is my main application 
|-main 
    |-java 
     |-controllers 
      |here are my controllers 
     |-dao 
     |-service 
    |-ressources 
     |-css 
     |-images 
     |-view 
      |here are the fxml files 
+0

Учитывая 'главный/resources' это только путь к классам, вы пытались заменить' GetClass() getResource ("/ главная/RESSOURCES/вид. /MainUI.fxml ")' с 'getClass(). GetResource ("/view/MainUI.fxml ")'? – ItachiUchiha

+0

Можете ли вы добавить код для fxml. Я придерживаюсь мнения, что у вас неправильный контроллер в вашем fmxl. – ItachiUchiha

+0

Не уверен, но я думаю, что пакет «MainUIController» ошибочен. 'Caused by: java.lang.ClassNotFoundException:/java/controllerlers/MainUIController' говорит, что класс находится в пакете' java.controllers', но сам класс определяет пакет как: 'package main.java.controllers;' – MalaKa

ответ

1

Я предлагаю изменить структуру проекта. Ресурсы не должны находиться в самих источниках. Поэтому я предлагаю следующую структуру проекта:

src 
|-main 
    |-java <-- This should be your 'sources root' 
     |-application <-- The application itself is within the new sources root 
     |-controllers 
      |here are my controllers 
     |-dao 
     |-service 
    |-resources <-- all resources (css files, images, fxml files) should be with a subfolder of the resources. This folder should be marked as 'resources root' 
     |-css 
     |-images 
     |-view 
      |here are the fxml files 

Эта структура может быть настроена в любой среде IDE. Как вы можете настроить его, зависит от самой IDE. Обычно вы можете просто щелкнуть правой кнопкой мыши папку в обзоре и отметить ее как источник/ресурс root. Точные имена «исходный корень» и «корень ресурсов» зависят от среды IDE.

Main В настоящее время в пакете application и MainUIController находится в упаковке controllers.

В FXML-файле необходимо указать:

fx:controller="controllers.MainUIController" 

Загрузка FXML-файл должен работать с:

AnchorPane root = (AnchorPane) FXMLLoader.load(getClass().getClassLoader().getResource("view/MainUI.fxml")); 

В качестве эталона для следующего объяснения, имеют вид here:
ClassLoader всегда начинается с корня ваших ресурсов. Если вы используете только getClass, путь к ресурсу является относительным путем. Поговорив с ним несколько раз, я для себя решил всегда использовать абсолютные пути и, следовательно, использовать getClassLoader.
Как объяснено в ссылке выше, обратите внимание, что

getClass().getClassLoader().getResource("view/MainUI.fxml"); 

может быть заменен

getClass().getResource("view/MainUI.fxml"); 

Я думаю, что я где-то читала, что лучше непосредственно использовать InputStream если таковые имеются, в обращение с URL-адресами в JAR-файлах может иногда быть сложным (но в настоящее время я не могу найти ссылку для поддержки этого). Таким образом, в качестве альтернативы getResource(..), вы можете использовать:

FXMLLoader loader = new FXMLLoader(); 
Parent root = loader.load(getClass().getClassLoader().getResourceAsStream("view/MainUI.fxml"); 
+0

Да, спасибо. Если бы это было так, за исключением того, что папка приложения находилась внутри java-папки. Текстовое поле должно быть запутано с моими расстояниями – PooBucket

+0

Вы можете создать макет, как предлагает MalaKa, используя [JavaFX Maven archetype] (https://github.com/javafx-maven-plugin/javafx-basic-archetype) (хотя это может смутить вас больше, чем помочь, если вы не знакомы с Maven). – jewelsea

+0

Mhmm .. getClassLoader() - кажется, неизвестен. Пропустите ли я какие-либо импорт здесь или что-то еще? – PooBucket

2

атрибут fx:controller ожидает полное имя класса класса контроллера. То есть если у вас есть

package main.java.controllers ; 

public class MainUIController { ... } 

вы должны иметь

fx:controller="main.java.controllers.MainUIController" 
+0

Я уже пробовал это, но спасибо. :/но это не semm, чтобы что-либо изменить – PooBucket

+0

Если вы прочитали трассировку стека, становится ясно, что проблема 'fx: controller' является проблемой. Я немного обновил ответ после прочтения ваших комментариев выше. –

+0

whoa извините, чувак, я снова попробовал ваш ответ и улучшил его с предложением Malakas о архитектуре пакета, и теперь он работает отлично! Awesome :) – PooBucket

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