Instanz von FXMLDocumentController erlangen

  • Themenstarter Themenstarter hk
  • Beginndatum Beginndatum

hk

Bekanntes Mitglied
Hallo Forum,
ich versuche mich in JavaFX und lande bei folgenden Problem:
Ich habe in “FXMLDocumentController.java” ein GridPane und eine Methode welche die Farbe eines Grid-Elements ändern soll. Diese Methode möchte ich aus der main-Klasse ansprechen. Das geht aber nicht, weil ich die Instanz der FXMLDocumentController Klasse nicht bekomme.
Daher meine Frage: Gibt es eine Möglichkeit diese Instanz in der main-Klasse zu eruieren?
lg heinz

PS: Ich habe mir das MainWithControllerFactory.java Beispiel angesehen, sehe aber nicht wie ich das anwenden soll.
 
Wenn du dein FXML mit dem FXMLLoader lädst bekommst du doch die Referenz auf den Controller. Oder auf welche Weise lädst du deine Views?
 
Hallo looparda,
danke für die Blitzantwort.
mein FXMLLoader sieht so aus:
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
} //end start -------------------------------
Daraus ersehe ich nicht wie ich den Controller ansprechen soll?
lg heinz
 
Wenn du mit
Java:
FXMLLoader loader = new FXMLLoader(getClass().getResource("FXMLDocument.fxml"));
anfängst siehst du es vielleicht eher.
 
Ich habe nun eine Lösung (aus einem Beispiel) gefunden. Aber ich bin mir nicht sicher ob das mit einer zusätzliche Klasse der optimale Weg ist?
Java:
    @Override
    public void start(Stage stage) throws Exception {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("FXMLDocument.fxml"));
        loader.setController(Verbinder.controller);
        loader.load();
        Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();
      
}           //end start -------------------------------

public class Verbinder {
    public static FXMLDocumentController controller = new FXMLDocumentController();
}
 
Ich dachte an sowas
Java:
package fxmlloader;

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

import java.io.IOException;

public class FxmlLoaderTest extends Application {

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

        FXMLLoader loader = new FXMLLoader(getClass().getResource("FXMLDocument.fxml"));
        Parent root = loader.load();
        MyController ctrl = loader.getController();
        ctrl.handleButtonAction();
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();
    }

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

Code:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.CheckBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.111" fx:controller="fxmlloader.MyController">
    <children>
        <Button fx:id="button" layoutX="126" layoutY="90" onAction="#handleButtonAction" text="Click Me!" />
        <Label fx:id="label" layoutX="126" layoutY="120" minHeight="16" minWidth="69" />
    </children>
</AnchorPane>

Java:
package fxmlloader;

import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;


public class MyController {

    private int counter;

    @FXML
    Button button;

    @FXML
    Label label;

    public void handleButtonAction() {
        label.setText("clicked " + ++counter);
    }
}
 
Ja, danke. Das funktioniert nun aber die Instanz hält sich nicht lange. Ich versuche den Ablauf darzustellen:
Main-Klasse
- start Methode: Instanz holen und speichern (fxml), Aufruf der GUI-Initialisierung fxml.ladeGebietsdaten(this).
- FXML-Controller-Klasse: Instanz von Main-Klasse speichern (demo), Init durchführen.
- FXML-Controller-Klasse: handleButtonAction(), Aufruf demo.startDemo().
- Main-Klasse startDemo(), Aufruf fxml.setNodeFarbe !! und hier ist fxml null ??

Java:
   public static FXMLDocumentController fxml;
        @Override
    public void start(Stage stage) throws Exception {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("FXMLDocument.fxml"));
        Parent root = loader.load();
        FXMLDocumentController fxml = loader.getController();
().getResource("FXMLDocument.fxml"));
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();
         fxml.ladeGebietsDaten(this);    //eigene Instanz für beidseitige Verbindung
    }           //end start -------------------------------

    public void startDemo() {
        // Start- und Ziel-Node einfärben
        Node node = nodeListe.get(startNode);
        fxml.setNodeFarbe(node.getLabel(), 0); //fxml = null
FXMLDocumentController
Code:
    AStarDemo demo;
   
    /**
     * Eingaben prüfen und Hauptprogramm aufrufen
     * @param event
     */
    @FXML
    public void handleButtonAction(ActionEvent event) {
         //
         // Wegsuche kann gestartet werden
        demo.startDemo();
    }
 

Neue Themen


Zurück
Oben