Wenn ich in JavaFX versuche, eine Methode von einem verschachtelten Controller zum Hauptcontroller aufzurufen, erhalte iJava

Java-Forum
Guest
 Wenn ich in JavaFX versuche, eine Methode von einem verschachtelten Controller zum Hauptcontroller aufzurufen, erhalte i

Post by Guest »

Ich erstelle derzeit eine einfache Anwendung, um eine TXT-Datei zu lesen und 3D-Punkte in der Szene zu visualisieren.
Dies ist mein aktueller Code:
Main.java

Code: Select all

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

public class Main extends Application {

@Override

public void start(Stage primaryStage) throws Exception {

FXMLLoader mainLoader = new FXMLLoader(getClass().getResource("FXML/Main.fxml"));
Parent root = mainLoader.load();
MainController mainController = mainLoader.getController();

if (mainController != null) {
System.out.println("mainController has been loaded correctly..");
}

FXMLLoader importMenuLoader = new FXMLLoader(getClass().getResource("FXML/ImportMenu.fxml"));
importMenuLoader.load();
ImportMenuController importMenuController = importMenuLoader.getController();

if (importMenuController != null) {
System.out.println("importMenuController has been loaded correctly.");
} else {
System.err.println("importMenuController has not been loaded correctly.");
}

assert importMenuController != null;
importMenuController.setMainController(mainController);

importMenuController.setMainController(mainController);

Scene scene = new Scene(root, 1920, 1080);

primaryStage.setTitle("Test");
primaryStage.setScene(scene);
primaryStage.show();
}

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

Code: Select all
















FileMenu.fxml

Code: Select all












ImportMenu.fxml

Code: Select all









MainController.java

Code: Select all

package controllers;

import javafx.fxml.FXML;
import javafx.scene.Group;

import javafx.scene.control.Menu;
import node.Node;

public class MainController {

@FXML private Menu fileMenu;
@FXML private FileMenuController fileMenuController;
@FXML private Group centerGroup;

@FXML
public void initialize() {
}

public void addNodeToScene(double x, double y, double z, int ID) {
Node node = new Node(x, y, z, ID);
centerGroup.getChildren().add(node.getSphere());
}
}
FileMenuController

Code: Select all

package controllers;

import javafx.fxml.FXML;
import javafx.scene.control.Menu;

public class FileMenuController {

@FXML private Menu importMenu;
@FXML private ImportMenuController importMenuController;

@FXML
public void initialize() {
}
}
ImportMenuController

Code: Select all

package controllers;

import javafx.fxml.FXML;
import javafx.stage.FileChooser;

import java.io.*;

public class ImportMenuController {

private MainController mainController;

@FXML
public void initialize() {
}

public void setMainController(MainController mainController) {
this.mainController = mainController;
if (mainControl != null) {
System.out.println("mainController has been loaded correctly.");
}
}

@FXML
public void onImportSolverDeck() {

try {
FileChooser fileChooser = new FileChooser();
fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Text File (.txt)", "*.txt"));
File selectedFile = fileChooser.showOpenDialog(null);
if (selectedFile != null) {
femLoader(selectedFile);
}
} catch (IOException e) {
System.out.println("Unable to read the selected file: " + e.getMessage());
}
}

private void femLoader(File femFile) throws IOException {

try (BufferedReader reader = new BufferedReader(new FileReader(femFile))) {
String line;
while ((line = reader.readLine()) != null) {
if (line.startsWith("GRID")) {
String[] parts = line.split("\\s+");
int ID = Integer.parseInt(parts[1]);
double x = Double.parseDouble(parts[2]);
double y = Double.parseDouble(parts[3]);
double z = Double.parseDouble(parts[4]);
mainController.addNodeToScene(x, y, z, ID);
}
}
}
}
}
Die Klasse Node.java ist nur eine Erweiterung von Point3D und es macht keinen Sinn, sie dem ohnehin langen Beitrag hinzuzufügen. Die Szene wird problemlos geladen, aber jedes Mal, wenn ich auf die TXT-Datei klicke, wird eine NullPointerException ausgelöst. Insbesondere wird this.mainController plötzlich null, nachdem die Datei ausgewählt wurde. Ich habe wirklich Mühe, das Problem hier zu finden, und wäre für jede Hilfe sehr dankbar.
----------EDIT----------
Ich weiß, was eine NullPointerException in JavaFX ist, aber mainController ist nicht null, bevor die gewünschte Datei mit der onSolverDeckImport-Methode ausgewählt wird.
Ich habe einige if hinzugefügt Anweisungen in Main.java und der setMainController-Methode und alle drei geben mir den richtigen Controller.
mainController wird danach aus irgendeinem Grund tatsächlich null.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post