加载fxml文件

时间:2015-11-30 21:58:23

标签: java javafx-8 fxml fxmlloader fileloadexception

您好我正在使用javaFx,我是新手。 我需要帮助。 在运行主应用程序时,我收到javafx.fxml.LoadException的错误:

请帮助。

代码: 主要代码

package mainApp;


import controller.LoginController;
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 {
            //Create a loader for the UI components
            FXMLLoader loader = new FXMLLoader();
                    loader.setLocation(Main.class.getResource("/view/loginFx.fxml"));
            //Inflate the view using the loader
            AnchorPane root = (AnchorPane) loader.load();
            //Set window title
            primaryStage.setTitle("Welcome");
            //Create a scene with the inflated view
            Scene scene = new Scene(root);
            //Set the scene to the stage
            primaryStage.setScene(scene);
            //Get the controller instance from the loader
            LoginController controller = loader.getController();
            //Set the parent stage in the controller
            controller.setDialogStage(primaryStage);
            //Show the view
            primaryStage.show();
        } catch(Exception e) {
            //System.out.println("Error occured while inflating view: " + e);
            e.printStackTrace();
        }
    }


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

fxml文件

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

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

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="login.controller.LoginController">
    <children>
        <Label layoutX="113.0" layoutY="102.0" text="UserName" />
        <Label layoutX="116.0" layoutY="173.0" text="Password" />
        <TextField fx:id="UserName" layoutX="200.0" layoutY="98.0" />
        <Button layoutX="242.0" layoutY="251.0" mnemonicParsing="false" onAction="#loginbutton" text="Login" />
        <Text fx:id="username" layoutX="200.0" layoutY="400.0" />
      <PasswordField layoutX="200.0" layoutY="169.0" />
      <Label layoutX="54.0" layoutY="45.0" prefHeight="17.0" prefWidth="130.0" text="Welcome" />
   </children>

</AnchorPane>

控制器文件:

package controller;


//import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.TextField;
//import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;

import model.Login;
import dao.UserDao;

public class LoginController {
    //This is the parent stage
        private Stage dialogStage;

        //This is the Text box element in the view for name of bank
        @FXML
        private TextField username;
        //Method to set the parent stage of the current view
        public void setDialogStage(Stage dialogStage) {
            this.dialogStage = dialogStage;
        }
        public void loginbutton() {
            //Extract the data from the view elements
            String username = this.username.getText();
        //  String address = this.address.getText();
            //Validate the data
            if(username == null || username.trim().equals("")) {
                return;
            }

        Login login = new Login();
        login.setName(username);
        UserDao u = new UserDao();
        u.create(login);
        close();
        }

        private void close() {
            dialogStage.fireEvent(new WindowEvent(dialogStage,WindowEvent.WINDOW_CLOSE_REQUEST));
        }

    }

请告诉我这是什么问题 我收到以下错误: javafx.fxml.LoadException: /C:/Users/Neel-Megha/workspace/User/bin/view/loginFx.fxml:11

at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
at javafx.fxml.FXMLLoader.access$700(FXMLLoader.java:103)
at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:922)
at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:971)
at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:220)
at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:744)
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
at mainApp.Main.start(Main.java:19)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$163(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$176(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$174(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at 

com.sun.javafx.application.PlatformImpl.lambda$runLater$175(PlatformImpl.java:294)
    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.lambda$null$149(WinApplication.java:191)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: login.controller.LoginController
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:920)
    ... 17 more

1 个答案:

答案 0 :(得分:0)

堆栈跟踪告诉您问题:

  

引起:java.lang.ClassNotFoundException:login.controller.LoginController

您在FXML文件中将控制器声明为fx:controller="login.controller.LoginController",因此FXMLLoader正在LoginController包中寻找login.controller类。但是,您的LoginController类声明它位于controller包中:

package controller ;

// ...

public class LoginController { ... }

因此,您应该将FXML更改为fx:controller="controller.LoginController"

(您的代码中可能还有其他错误:这是导致您发布错误的错误。)

顺便说一句,您不需要将Stage实例连接到控制器的所有代码。只是做

private void close() {
    username.getScene().getWindow().hide();
}

现在您可以从dialogStage中删除setDialogStage()LoginController方法,然后删除这些行

LoginController controller = loader.getController();
controller.setDialogStage(primaryStage);

来自Main

(当然有些时候你需要访问控制器,但是可以从UI中的任何节点访问的舞台的所有这些不必要的布线让我发疯。)