带有 FXMLLoader.load(getClass().getClassLoader().getResource("Login.fxml")) 的 JavaFX 错误;

Dav*_*ick 3 javafx

我一生都无法弄清楚这段代码的问题。我在这里对许多类似的问题进行了研究,解决了目录是否正确、可能错误的函数调用等问题。

我希望有人可以帮助我。一切都在名为 loginapp 的应用程序中名为 login 的文件中。

这是 Login.java

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package login;

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


public class Login extends Application   {

    @Override
    public void start(Stage stage) throws Exception {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("Login.fxml"));
        Parent root = FXMLLoader.load(getClass().getClassLoader().getResource("Login.fxml"));
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.setTitle("Fracken");
        stage.show();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是 Login.fxml

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package login;

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


public class Login extends Application   {

    @Override
    public void start(Stage stage) throws Exception {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("Login.fxml"));
        Parent root = FXMLLoader.load(getClass().getClassLoader().getResource("Login.fxml"));
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.setTitle("Fracken");
        stage.show();
    }
}
Run Code Online (Sandbox Code Playgroud)

我确定问题出在

Parent root = FXMLLoader.load(getClass().getClassLoader().getResource("Login.fxml"));
Run Code Online (Sandbox Code Playgroud)

我收到这个错误。

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

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane id="AnchorPane" prefHeight="317.0" prefWidth="326.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="login.Login">
   <children>
      <TextField fx:id="txtUsername" layoutX="110.0" layoutY="45.0" promptText="Username" />
      <PasswordField fx:id="txtPassword" layoutX="110.0" layoutY="115.0" promptText="Password" />
      <Button fx:id="btnLogin" layoutX="110.0" layoutY="184.0" mnemonicParsing="false" onAction="btnLoginAction" text="Login" />
      <Button fx:id="btnReset" layoutX="232.0" layoutY="184.0" mnemonicParsing="false" onAction="btnResetAction" text="Reset" />
      <Label fx:id="lblMessage" layoutX="110.0" layoutY="236.0" prefHeight="31.0" prefWidth="187.0" />
   </children>
</AnchorPane>
Run Code Online (Sandbox Code Playgroud)

请帮助我,我在这里查看了其他人的类似问题,但没有解决方案。

fab*_*ian 5

getClass().getResource("Login.fxml")应该返回一个非空值,因为 usingClass.getResource查找相对于类的资源。由于您似乎已将资源放在login包中,因此在该包中使用具有资源名称的类Login.fxml应该可以工作。

出于某种原因,您不使用FXMLLoader传递此资源URL的对象。相反,您使用

getClass().getClassLoader().getResource("Login.fxml")
Run Code Online (Sandbox Code Playgroud)

即您使用类加载器加载文件。然而,类加载器不知道您从中检索它的类,因此会尝试Login.fxml在默认包中定位。

如果使用类加载器,则应使用完整路径,即

getClass().getClassLoader().getResource("login/Login.fxml")
Run Code Online (Sandbox Code Playgroud)