简体   繁体   中英

FXML ClassNotFoundException

Error

C:\Users\rbenedict\Documents\Java Modules>java -cp .;fxmltut fxmltut.FXMLEx
Exception in Application start method
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(Unk
nown Source)
        at com.sun.javafx.application.LauncherImpl.launchApplication(Unknown Sou
rce)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
        at com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown So
urce)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(
Unknown Source)
        at java.lang.Thread.run(Unknown Source)
Caused by: javafx.fxml.LoadException:
/C:/Users/rbenedict/Documents/Java%20Modules/fxmltut/FXMLDoc.fxml

        at javafx.fxml.FXMLLoader.constructLoadException(Unknown Source)
        at javafx.fxml.FXMLLoader.importClass(Unknown Source)
        at javafx.fxml.FXMLLoader.processImport(Unknown Source)
        at javafx.fxml.FXMLLoader.processProcessingInstruction(Unknown Source)
        at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
        at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
        at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
        at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
        at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
        at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
        at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
        at javafx.fxml.FXMLLoader.load(Unknown Source)
        at fxmltut.FXMLEx.start(FXMLEx.java:17)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162
(Unknown Source)
        at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(Unknown
 Source)
        at com.sun.javafx.application.PlatformImpl.lambda$null$173(Unknown Sourc
e)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(Unknown S
ource)
        at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
        at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at com.sun.glass.ui.win.WinApplication.lambda$null$148(Unknown Source)
        ... 1 more
Caused by: java.lang.ClassNotFoundException
        at javafx.fxml.FXMLLoader.loadType(Unknown Source)
        ... 21 more
Exception running application fxmltut.FXMLEx

I tried with and without package fxmltut . Without I get the same exception and did some checking online. Apparently, javafx parses the import statement by looking for the . token and taking the identifier after. So I made it part of a package and I am still getting the same error.

FXMLEx.java

package fxmltut;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;

import javafx.scene.Parent;
import java.lang.Class;

import javafx.fxml.FXMLLoader;

public class FXMLEx extends Application {

    @Override
    public void start(Stage stage) throws Exception {

        Parent root = FXMLLoader.load(getClass().getResource("FXMLDoc.fxml"));
        Scene scene = new Scene(root, 300,275);

        stage.setTitle("FXML Welcome");
        stage.setScene(scene);
        stage.show();

    }

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

}

FXMLCont.java

package fxmltut;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.text.Text;

public class FXMLCont {
    @FXML private Text actTarg;
    @FXML protected void handleSubmitButtonAction(ActionEvent event) {
        actTarg.setText("Sign in button pressed");
    }
}

FXMLDoc.fxml

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

<?import fxmltut.*?>
<?import java.net.*?>
<?import java.geometry.*?>
<?import java.scene.control*?>
<?import java.scene.layout.*?>
<?import java.scene.text.*?>

<GridPane fx:controller="fxmltut.FXMLCont"

    xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
    <padding><Insets top="25" right="25" bottom="25" left="25"/></padding>

</GridPane>

<Text text="Welcome"
    GridePane.columnIndex="0" GridPane.rowIndex="0"
    GridPane.columnSpan="2"/>

<Label text="User Name:"
    GridPane.columnIndex="0" GridPane.rowIndex="1"/>
<TextField
    GridPane.columnIndex="1" GridPane.rowIndex="1"/>

<Label text="Password:"
    GridPane.columnIndex="0" GridPane.rowIndex="2"/>

<PasswordField fx:id="pw" GridPane.columnIndex="1" GridPane.rowIndex="2"/>

<HBox spacing="10" alignment = "bottom_right"
    GridPane.columnIndex="1" GridPane.rowIndex="4">

    <Button text="Sign in"
    onAction="#handleSubmitButtonAction"/>

</HBox>

<Text fx:id="actTarg"
    GridPane.columnIndex="0" GridPane.columnSpan="2"
    GridPane.halignment="RIGHT" GridPane.rowIndex="6" />

At first you should check that FXML file could be loaded. getClass().getResource("FXMLDoc.fxml") must be not null and must provide no Exception.

At second, as @fabian already have said, your FXML is ill-formed. It must contain only one root tag as any other XML.

Your FXML has invalid format. You should have all nodes in GridPane container.

Like fabian said in comments ensure there is a single root element.

Try to put code simple as below and see if application is running. If it is, then it was incorrectly defined fxml file layout.

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

<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.BorderPane?>

<GridPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="377.0" prefWidth="533.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="fxmltut.FXMLCont">

</GridPane>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM