" FXMLLoader.constructLoadException"当试图运行java fx应用程序时 [英] "FXMLLoader.constructLoadException" when trying to run java fx application

查看:246
本文介绍了" FXMLLoader.constructLoadException"当试图运行java fx应用程序时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经搜索了互联网的最深处,但似乎找不到答案 - .-

I already searched the deepest depths of the interweb but no answer will seem to be found -.-

问题在于我想写的javaFx程序。但我不能再添加控制器类了。我几乎遵循了所有可以找到的教程,但这个问题仍然不为我所知。

The problem is in my javaFx programm i want to write. But i can't make it any further than adding the controller class. I followed nearly every tutorial a could find, but the issue still remains unknown to me.

这是例外:

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

这是代码。还有thre类:Main.class,我使用的是我的MainUI.fxml,它是使用scenebuilder 2和我的MainUIController.class创建的,它显然可以作为mainuis控制器使用

and this is the code. there are thre classes: The Main.class, my MainUI.fxml which i created using scenebuilder 2 and my MainUIController.class which should obviously work as the mainuis controller

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");
        });


    }
}

编辑:这是我的包结构:

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


推荐答案

我建议改变项目结构。资源本身不应存在于资源中。所以我的建议是以下项目结构:

I suggest to change the project structure. The resources should not be resided in the sources itself. So my suggestion is the following project structure:

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本身。通常,您只需右键单击概述中的文件夹,并将标记作为源/资源根目录。 source root和resources root的确切名称取决于IDE。

This structure can be set up in any IDE. How you can set it up depends on the IDE itself. Normally you can simply right-click the folder in the overview and mark is as sources/resources root. The exact names for 'source root' and 'resources root' depend on the IDE.

Main 现在位于包应用程序 MainUIController 位于包 controllers 中。

The Main is now in the package application and the MainUIController is in the package controllers.

在FXML文件中,您应指定:

In the FXML-File you should specify:

fx:controller="controllers.MainUIController"

加载FXML文件应该可以使用:

Loading the FXML-File should work with:

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






作为以下说明的参考,请参阅看看这里

ClassLoader 始终从资源的根开始。如果只使用 getClass ,则资源的路径是相对路径。在多次处理之后,我自己决定总是使用绝对路径,因此使用 getClassLoader

如上面的链接所述,请注意


As a reference for the following explanation, have a look here:
The ClassLoader always starts at the root of your resources. If you only use getClass, the path to the resource is a relative path. After dealing with it several times, I for myself have decided to always use absolute paths and therefore use the getClassLoader.
As explained in the link above, please note that

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

可以替换为

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

我认为我在某处阅读,最好直接使用 InputStream 如果可用,因为处理JAR-Files中的URL有时会很棘手(但我目前找不到支持它的引用)。因此,作为 getResource(..)的替代方案,您可以使用:

I think that I somewhere read, that it is better to directly use the InputStream if available, as dealing with URLs within JAR-Files can be tricky sometimes (but I currently can't find a reference to support that). So as an alternative to the getResource(..), you could use:

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

这篇关于&QUOT; FXMLLoader.constructLoadException&QUOT;当试图运行java fx应用程序时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆