JavaFX Gleiche Controller-Instanz für inludiertes FXML

KrokoDiehl

Top Contributor
Hallo zusammen,

entweder ich stehe auf dem Schlauch oder es ist tatsächlich eine komplexere Sache in JavaFX:
Ich verwende JavaFX (8) mit FXML und möchte in einer - bereits großen - FXML-Datei eine andere inkludieren - hauptsächlich um die Datei nicht größer werden zu lassen.
Beide sollen aber die gleiche Controller-Instanz verwenden.

Hier ein Beispiel dass es verdeutlichen soll:
Java:
public class DerController {
  ...

  @FXML
  public void buttonImHauptFXMLgeklickt() {
  ... ich werde gefunden
  }

  @FXML
  public void buttonImSubFXMLgeklickt() {
  ... mich findet es nicht
  }
}

Die Haupt-FXML-Datei welche den Controller hat:
Code:
<VBox ...>
  <!-- viele UI-Komponenten -->
  <Button text="Haupt fxml" onAction="#buttonImHauptFXMLgeklickt" />

  <HBox>
  <fx:include source="subFxml.fxml" />
  </HBox>
</VBox>

Die Sub-FXML-Datei welche inkludiert wird:
Code:
<GridPane ....>
  <!-- diverse UI-Kompenten -->
  <Button text="Sub fxml" onAction="#buttonImSubFXMLgeklickt" />
</GridPane>

Geladen wird die Haupt-FXML-Komponenten über FXMLLoader wo ich die Controller-Instanz auch direkt setze. Das heißt der Controller wird nicht vom FXML instanziiert.
Für die inkludierte FXML-Datei möchte ich nun auch gerne die gleiche Controller-Instanz verwenden.

Starte ich das Ganze jedoch nach dem obigen Schema, bekomme ich folgenden Fehler:
Code:
Caused by: javafx.fxml.LoadException: No controller specified.
Die Stelle ist auch eindeutig: Dort wo im Sub-FXML die onAction-Deklaration ist hat er keinen Controller.

Kennt jemand eine Lösung oder hat sonstige Meinungen dazu? Ich kenne schon ein paar Workarounds, die arbeiten aber alle ohne ein fx:inlcude sondern laden das Sub-FXML separat und bauen die UI dann im Code zusammen.


Vielen Dank im Voraus!
 

knilch

Bekanntes Mitglied
Hi,
Ja, du kannst in ein include den selben Controller wie die "Hauptview" verwenden. Siehe nachfolgend ein Beispiel mit 3 FXMLs und 1.Controller.
ChildView1.fxml und ChildView2.fxml sind im MainView.fxml included. Alle 3 FXMLs benutzen den MainViewController.
MainView.fxml:
Code:
<?xml version="1.0" encoding="UTF-8"?>

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

<AnchorPane prefHeight="280.0" prefWidth="500.0"
    xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2"
    fx:controller="test11.MainViewController">
    <children>
        <VBox prefHeight="280.0" prefWidth="500.0"
            AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0"
            AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
            <children>
                <fx:include fx:id="child1" source="ChildView1.fxml" />
                <fx:include fx:id="child2" source="ChildView2.fxml" />
            </children>
        </VBox>
    </children>
</AnchorPane>
MainViewController.java:
Java:
package test11;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.layout.AnchorPane;

public class MainViewController {
    @FXML
    private Parent view;
    @FXML
    private AnchorPane child1;
    @FXML
    private AnchorPane child2;

    @FXML
    private Button button1;
    @FXML
    private Button button2;
    @FXML
    private Button button3;
    @FXML
    private Button button4;
    
    @FXML
    protected void handleButtonEvent(ActionEvent event) {
        String parentName = ((Node) event.getSource()).getParent().getParent().getId();
        System.out.println("ChildViewController: " + ((Button)event.getSource()).getText() + " von " + parentName + " wurde gedrückt...");
    }

    @FXML
    void initialize() {
        System.out.println("MainViewController.initialize()");
    }
}

ChildView1.fxml:
Code:
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import java.net.*?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.control.Button?>

<AnchorPane fx:id="child1" id="child1" prefHeight="244.0" prefWidth="568.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="test11.MainViewController">
    <children>
        <HBox id="hBox1" layoutX="32.0" layoutY="14.0" prefHeight="51.0" prefWidth="200.0" spacing="10.0">
            <children>
                <Button fx:id="button1" prefHeight="37.0" text="Button 1" onAction="#handleButtonEvent" />
                <Button fx:id="button2" prefHeight="37.0" text="Button 2" onAction="#handleButtonEvent" />
            </children>
        </HBox>
    </children>
</AnchorPane>
ChildView2.fxml:
Code:
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import java.net.*?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.control.Button?>

<AnchorPane fx:id="child2" id="child2" prefHeight="244.0" prefWidth="568.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="test11.MainViewController">
    <children>
        <HBox id="hBox2" layoutX="32.0" layoutY="14.0" prefHeight="51.0" prefWidth="200.0" spacing="10.0">
            <children>
                <Button fx:id="button3" prefHeight="37.0" text="Button 3" onAction="#handleButtonEvent" />
                <Button fx:id="button4" prefHeight="37.0" text="Button 4" onAction="#handleButtonEvent" />
            </children>
        </HBox>
    </children>
</AnchorPane>
Main.java:
Java:
package test11;

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 {

    public void start(Stage primaryStage) {
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("MainView.fxml"));
            Parent rootElement = (Parent) loader.load();
            Scene scene = new Scene(rootElement, 800, 600);
            primaryStage.setTitle("JavaFX");
            primaryStage.setScene(scene);
            primaryStage.show();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {    
        launch(args);
    }
}
Vielleicht wäre es aber besser, für jedes fxml einen separaten Controller zu erstellen, damit es übersichtlicher strukturiert werden kann... (ist nur so meine Meinung... ;-) )
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
_user_q JavaFX Wie kann ich alle Objekte außer eins deaktivieren (das Gleiche mit BoxBlur)? AWT, Swing, JavaFX & SWT 11
schoel27 Mehrere JButtons sollen das gleiche Event auslösen AWT, Swing, JavaFX & SWT 2
D JavaFX Alle Knöpfe auf die gleiche Größe AWT, Swing, JavaFX & SWT 14
C Swing gleiche Einträge in JTable farblich markieren AWT, Swing, JavaFX & SWT 5
0 Swing Drag n' Drop Bug wenn Source und Target gleiche Komponente? AWT, Swing, JavaFX & SWT 4
R Swing alle Frames nutzen das gleiche Model AWT, Swing, JavaFX & SWT 2
spacegaier BoxLayout: Buttons auf gleiche Größe bringen AWT, Swing, JavaFX & SWT 4
G ein ContentProvider für 2 fast gleiche tabellen AWT, Swing, JavaFX & SWT 7
S gleiche Ergebnisse rauskommen AWT, Swing, JavaFX & SWT 3
M JButtons immer gleiche Größe? AWT, Swing, JavaFX & SWT 8
S gleiche elemente öffters benutzen AWT, Swing, JavaFX & SWT 10
B Zwei "gleiche" Objekte auf einem Frame platzieren AWT, Swing, JavaFX & SWT 2
C Inhalte in immer das gleiche Fenster ausgeben? AWT, Swing, JavaFX & SWT 3
MiMa Strukturierung und Organisation von umfangreiche Controller AWT, Swing, JavaFX & SWT 1
R Fxml findet controller nicht AWT, Swing, JavaFX & SWT 2
_user_q Objekte vom MainController in anderen Controller verwenden und andersherum (NullPointerException) AWT, Swing, JavaFX & SWT 14
sserio Wie funktioniert ein Controller bei JavaFx? AWT, Swing, JavaFX & SWT 1
A JavaFX Controller Problem AWT, Swing, JavaFX & SWT 1
I JavaFX - Pane wechseln über 2. Controller AWT, Swing, JavaFX & SWT 5
S JavaFX Fehler zwischen View und Controller bei MouseEvent (MVC) AWT, Swing, JavaFX & SWT 13
M4cM4rco0707 JavaFX Custom-Komponente mit Custom-Controller AWT, Swing, JavaFX & SWT 3
W Daten von Controller zu Controller übertragen AWT, Swing, JavaFX & SWT 7
J Saubere Trennung Model, View, Controller Javafx AWT, Swing, JavaFX & SWT 10
M JavaFX JavaFX in mehrere Controller AWT, Swing, JavaFX & SWT 21
OSchriever Auf Stage von FXML-Controller zugreifen AWT, Swing, JavaFX & SWT 12
J JavaFX JavaFX Splitpane - Zugriff auf die Controller der Elemente AWT, Swing, JavaFX & SWT 8
L JavaFX Exception nach includieren einer fxml // nested controller AWT, Swing, JavaFX & SWT 1
G JavaFX SplitPane Anwendung - Controller Probleme AWT, Swing, JavaFX & SWT 5
J Injection - Aber Controller sind null AWT, Swing, JavaFX & SWT 3
J Controller ist null - Warum AWT, Swing, JavaFX & SWT 3
@SupressWarnings() JavaFX Auf den Controller einer ListCell zugreifen AWT, Swing, JavaFX & SWT 4
L Javafx Controller Klasse in Maven AWT, Swing, JavaFX & SWT 7
M NullPointerException / Controller AWT, Swing, JavaFX & SWT 4
ralfb1105 JavaFX Daten zwischen Controller "austauschen" AWT, Swing, JavaFX & SWT 65
ralfb1105 JavaFX Exception Message von Model Class via Controller in View darstellen AWT, Swing, JavaFX & SWT 39
R JavaFX Übergabe von Parametern an Controller AWT, Swing, JavaFX & SWT 7
J Controller wird zu groß, was tun ? AWT, Swing, JavaFX & SWT 5
MiMa GUI Controller für Border Pane als MVC Modell AWT, Swing, JavaFX & SWT 1
K JavaFX in mehrere Controller aufteilen AWT, Swing, JavaFX & SWT 29
K JavaFX in mehrere Controller aufteilen AWT, Swing, JavaFX & SWT 0
F JavaFX ListView füllen in Controller Class AWT, Swing, JavaFX & SWT 12
L JavaFX Zugriff auf HostServices im FXML Controller AWT, Swing, JavaFX & SWT 1
V JavaFX Button Controller Fehler, trotz Erfolg in einem anderem Code? AWT, Swing, JavaFX & SWT 7
L Wie realisiere ich einen Controller AWT, Swing, JavaFX & SWT 1
M Java FX SceneBuilder 2.0, FXML, Controller AWT, Swing, JavaFX & SWT 1
T JavaFX Controller im extra Thread AWT, Swing, JavaFX & SWT 0
I JavaFX Im Controller die ProgressBar mit Task updaten AWT, Swing, JavaFX & SWT 6
A JavaFX Von Klasse auf Controller Inhalt zugreifen AWT, Swing, JavaFX & SWT 9
A JavaFX Controller Class saveFile AWT, Swing, JavaFX & SWT 2
X JavaFX getScene().getWindow() im JavaFX Controller AWT, Swing, JavaFX & SWT 1
D JavaFX Gesetzte Variable in einem Controller im Controller laden AWT, Swing, JavaFX & SWT 1
L JavaFX Verständnisfrage zu JavaFX FXML und Controller-Klasse AWT, Swing, JavaFX & SWT 1
K Kann nicht auf GUI Elemente zugreifen, mit einer Methode im Controller klappts, mit der anderen nich AWT, Swing, JavaFX & SWT 10
Z JAVAFX Stage über Controller weitergeben um css-file zu laden AWT, Swing, JavaFX & SWT 4
D JavaFX Controller Klasse splitten? AWT, Swing, JavaFX & SWT 16
F JavaFX Zugriff auf Controller Methode von einer normalen Klasse aus AWT, Swing, JavaFX & SWT 4
C JavaFX Controller class AWT, Swing, JavaFX & SWT 2
M Java FX Daten an Controller übergeben AWT, Swing, JavaFX & SWT 3
D JavaFX Zugriff auf Controller erlangen AWT, Swing, JavaFX & SWT 4
W JavaFX Label in Controller-Klasse in einer anderen Controller-Klasse ändern AWT, Swing, JavaFX & SWT 9
B mouseOnEntered ( Controller richtig implementieren) AWT, Swing, JavaFX & SWT 4
S View-Komponenten im Controller bekannt machen AWT, Swing, JavaFX & SWT 7
G Swing MVC / View - Controller AWT, Swing, JavaFX & SWT 7
R Model View Controller Konzept AWT, Swing, JavaFX & SWT 2
F Element anzeigen / erstellen. Maus vs Controller AWT, Swing, JavaFX & SWT 7
J Swing MVC mit Java Swing, insbesondere die Controller-Struktur AWT, Swing, JavaFX & SWT 4
A Controller für RCP AWT, Swing, JavaFX & SWT 2
J Swing Controller im MVC-Pattern AWT, Swing, JavaFX & SWT 9
M Swing Von einem Controller aus View-Elemente ändern AWT, Swing, JavaFX & SWT 11
D Design - View & Controller AWT, Swing, JavaFX & SWT 2
R Checkboxen - Event mit Controller abfangen AWT, Swing, JavaFX & SWT 7
P Verbindung View und Controller AWT, Swing, JavaFX & SWT 3
F MVC --> was ist der Controller? AWT, Swing, JavaFX & SWT 2
F MVC: Update von View und Controller AWT, Swing, JavaFX & SWT 5
S MVC - Neues Frame, neue View, neuer Controller? AWT, Swing, JavaFX & SWT 3
C Model View Controller - Beispielimplementation AWT, Swing, JavaFX & SWT 5
M SWT und Model View Controller? AWT, Swing, JavaFX & SWT 8
H Instanz von FXMLDocumentController erlangen AWT, Swing, JavaFX & SWT 9
G Anonyme Instanz von JXImageView erstellen und mit Bild initialisieren AWT, Swing, JavaFX & SWT 7
R Eine Instanz von JPanel mehrfach hinzufügen AWT, Swing, JavaFX & SWT 2
R Instanz einer Subklsse von JPanel wird nicht angezeigt. AWT, Swing, JavaFX & SWT 15
xehpuk Swing NullPointerException: Random-Instanz anfangs nicht initialisiert AWT, Swing, JavaFX & SWT 4
B Swing JPanel in Abhängigkeit von DefaultListModel Instanz neu zeichnen AWT, Swing, JavaFX & SWT 3
B Instanz einer abstrakten Klasse AWT, Swing, JavaFX & SWT 3
D Zugriff auf Instanz der GUI AWT, Swing, JavaFX & SWT 3
J Swing Eine(und zwar ein und die selbe) WindowListener Instanz für alle JFrames AWT, Swing, JavaFX & SWT 8
S initialnamen einer swing instanz zur laufzeit ändern AWT, Swing, JavaFX & SWT 5
raptorrs Swing MouseListener reagiert nicht auf Instanz einer JTable AWT, Swing, JavaFX & SWT 6
K Instanz von JEditorPane starten AWT, Swing, JavaFX & SWT 3
T statische Variable zum Referenzieren einer Instanz von Frame AWT, Swing, JavaFX & SWT 3
W Instanz eines Steuerelementes an zwei Stellen zeichnen AWT, Swing, JavaFX & SWT 3
K Bild in neuer InternetExplorer - Instanz öffnen AWT, Swing, JavaFX & SWT 3
M sicherstellen, dass nur eine Instanz läuft. AWT, Swing, JavaFX & SWT 6
S In Instanz von JTextArea schreiben AWT, Swing, JavaFX & SWT 4
S int-berechnung des RGB-Wertes ohne neue Instanz? AWT, Swing, JavaFX & SWT 9
H JFileChooser und Class Instanz AWT, Swing, JavaFX & SWT 2
H Neue Instanz einer Klasse bei JButton-Klick AWT, Swing, JavaFX & SWT 5
M Es bleibt immer noch eine Javaw instanz zurück AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben