有什么办法可以解决FXMLLoader错误?还是我错过了什么?

时间:2020-10-15 14:13:28

标签: csv javafx scenebuilder fxmlloader

我确实需要有关正在使用的JavaFX应用程序的帮助,但找不到我一直遇到的问题的解决方案。我在该程序中唯一想要的是通过调用我在MainController类上创建的另一个类(Fleet)中的方法来从csv文件中加载数据,但是我仍然遇到有关FXMLLoader和inputstream null的错误。我不确定在Main类或MainController类中是否做错了什么。我也不确定是否需要try catch语句。

这些是我得到的错误:

java.lang.NullPointerException: inputStream is null.
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2455)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2425)
    at application.Main.start(Main.java:32)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$7(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$5(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$6(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$4(WinApplication.java:186)
    at java.lang.Thread.run(Unknown Source)

这是主班:

package application;

import java.io.IOException;

import application.controller.MainController;
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.Parent;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.event.ActionEvent;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.BorderPane;


public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            /*BorderPane root = new BorderPane();*/

            /*root = FXMLLoader.load(getClass().getResource("/application/Main.fxml"));*/
            /*root = FXMLLoader.load(getClass().getResource("C:\\Users\\leo\\OneDrive"
                    + "\\Documents\\test"
                    + "\\src\\application\\Main.fxml"));*/

            FXMLLoader loader = new FXMLLoader();
            Parent root;
            root = loader.load(getClass().getClassLoader().getResourceAsStream("C:\\Users\\leo\\OneDrive"
                        + "\\Documents\\test"
                        + "\\src\\application\\Main.fxml"));
            loader.setController(new MainController());
            Scene scene = new Scene(root,400,400);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            primaryStage.setScene(scene);
            primaryStage.show();

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

        /*FXMLLoader loader = new FXMLLoader(getClass().getResource("Main.fxml"));
        Parent root = loader.load();
        primaryStage.setTitle("Spaceship testing title");
        Scene scene = new Scene(root, 800, 800);
        primaryStage.setResizable(false);
        primaryStage.setScene(scene);
        primaryStage.show();
*/
    }

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

MainController类:

package application.controller;

import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.layout.AnchorPane;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import java.awt.Label;
import java.io.IOException;

import application.model.Fleet;

public class MainController implements EventHandler<ActionEvent> {

    @FXML
    Button button1;
    @FXML
    TextArea txtResult;
    @FXML
    TextField txtInput;
    @FXML
    Label label1;

/*  @FXML
    private TextArea txtResult;
    @FXML
    private Label label1;
    @FXML
    private Button button1;
    @FXML
    private TextField txtInput;*/

    @FXML
    public void handle(ActionEvent actionEvent) {

        /*String input = txtInput.getText();

        txtResult.setText(input);
        System.out.println( "button clicked!" );*/

        Fleet fl = new Fleet("Casino Starship");

        try {
        fl.loadStarshipNames("C:\\Users\\leo\\OneDrive\\Documents\\test\\data\\fleet.csv");
        fl.loadCrewMembers("C:\\Users\\leo\\OneDrive\\Documents\\test\\data\\personnel.csv");

        String input = txtInput.getText();
        txtResult.setText(input);

        }catch (IOException ex) {

            System.out.println( "Error loading the file - please check its location." );
              ex.printStackTrace();
        }

/*      String input = txtInput.getText();
        txtResult.setText(input);*/

    }

}   // end class MainController

这是Main.fxml:

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" onDragDetected="#handle" prefHeight="800.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.MainController">
   <children>
      <TextField fx:id="txtInput" layoutX="137.0" layoutY="96.0" text="Text Field" />
      <Button fx:id="button1" layoutX="184.0" layoutY="131.0" mnemonicParsing="false" onAction="#handle" text="Button" />
      <TextArea fx:id="txtResult" layoutX="134.0" layoutY="176.0" prefHeight="90.0" prefWidth="174.0" text="Text Area" />
      <Label fx:id="label1" layoutX="182.0" layoutY="65.0" text="Enter a ship name" />
   </children>
</AnchorPane>

*注意:您看到的注释是我编写的代码,用它们替换了其他代码,以防万一它可以工作但仍然无法解决。

*注意:Main类在应用程序包中,MainController在application.controller包中,Fleet类在application.model包中

0 个答案:

没有答案