Hallo zusammen,
ich habe mal wieder eine Frage zu JavaFX und dem Austausch, sprich das auslesen von z.B. Text Feldern zwischen zwei Controller.
Ich habe dazu folgenden Thread von Euch gelesen und es versucht umzusetzen, es endet aber leider immer in einer NPE und ich weiß nicht genau wie/wo ich die " Controller Injection" machen soll.
https://www.java-forum.org/thema/javafx-in-mehrere-controller-aufteilen.180123/
Hier mal als Referenz mein einfaches kleines Beispiel:
Ich starte ein Fenster "Controller1" welches ein TextField und einen Button enthält. Bei drücken des Button wird ein weiteres Fenster -> Controller2, geöffnet. Dieses hat auch wieder ein TextField und ein Button. Beim drücken des Button in Fenster2 (Controller2) soll der Inhalt von controller1.textfield in das TextField von Controller2 geschrieben werden.
Referenz Code:
1. Main.java
2. Controller1.java
3. Controller2.java
4. Box1.fxml
5. Box2.fxml
ich habe schon versucht die Deklaration "Controller2 controller2;" in die initialize() Methode zu schreiben, bringt aber auch nichts.
Die NPE kommt in der Zeile
also wenn ich auf das Objekt zugreifen will.
Was ich in dem o.g. Thread nicht ganz verstanden habe ... muss ich in den .fxml Dateien noch includes einbauen? Wenn ja, wo oder geht das auch über den SceneBuilder?
Gruß
Ralf
ich habe mal wieder eine Frage zu JavaFX und dem Austausch, sprich das auslesen von z.B. Text Feldern zwischen zwei Controller.
Ich habe dazu folgenden Thread von Euch gelesen und es versucht umzusetzen, es endet aber leider immer in einer NPE und ich weiß nicht genau wie/wo ich die " Controller Injection" machen soll.
https://www.java-forum.org/thema/javafx-in-mehrere-controller-aufteilen.180123/
Hier mal als Referenz mein einfaches kleines Beispiel:
Ich starte ein Fenster "Controller1" welches ein TextField und einen Button enthält. Bei drücken des Button wird ein weiteres Fenster -> Controller2, geöffnet. Dieses hat auch wieder ein TextField und ein Button. Beim drücken des Button in Fenster2 (Controller2) soll der Inhalt von controller1.textfield in das TextField von Controller2 geschrieben werden.
Referenz Code:
1. Main.java
Java:
package application;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.scene.Parent;
import javafx.scene.Scene;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("Box1.fxml"));
Parent root = loader.load();
Scene scene = new Scene(root);
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.setTitle("Controller1");
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
Java:
package application;
import java.io.IOException;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.stage.Modality;
import javafx.stage.Stage;
public class Controller1 {
Controller2 controller2;
@FXML
TextField textField1;
@FXML
Button startCtrl2;
public void initialize() {
textField1.setText("The quick brown fox jumps over the lazy dog");
}
public void startCtrl2() throws IOException {
FXMLLoader loaderBox2 = new FXMLLoader(getClass().getResource("Box2.fxml"));
Parent rootBox2 = loaderBox2.load();
Stage stageBox2 = new Stage();
stageBox2.initModality(Modality.APPLICATION_MODAL);
stageBox2.setOpacity(1);
stageBox2.setTitle("Controller2");
Scene sceneBox2= new Scene(rootBox2);
sceneBox2.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
stageBox2.setScene(sceneBox2);
stageBox2.show();
}
}
Java:
package application;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
public class Controller2 {
Controller1 controller1;
@FXML
TextField textField2;
@FXML
Button setLabel;
public void initialize() {
}
@FXML
public void setInfoTextField2() {
textField2.setText(controller1.textField1.getText());
}
}
Java:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.text.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.VBox?>
<VBox prefHeight="151.0" prefWidth="429.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.Controller1">
<children>
<HBox alignment="CENTER" prefHeight="40.0" prefWidth="337.0">
<children>
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Controller1">
<font>
<Font name="System Bold" size="18.0" />
</font>
</Text>
</children>
<VBox.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</VBox.margin>
</HBox>
<HBox alignment="CENTER_LEFT" prefHeight="72.0" prefWidth="337.0">
<children>
<TextField fx:id="textField1" editable="false" prefHeight="30.0" prefWidth="272.0" />
<Button fx:id="startCtrl2" mnemonicParsing="false" onAction="#startCtrl2" text="Start Controller2">
<HBox.margin>
<Insets bottom="10.0" left="30.0" top="10.0" />
</HBox.margin>
</Button>
</children>
<VBox.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</VBox.margin>
</HBox>
</children>
</VBox>
Java:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.text.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.VBox?>
<VBox prefHeight="173.0" prefWidth="320.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.Controller2">
<children>
<HBox alignment="CENTER" prefHeight="55.0" prefWidth="320.0">
<children>
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Controller2">
<font>
<Font size="18.0" />
</font>
</Text>
</children>
<VBox.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</VBox.margin>
</HBox>
<HBox alignment="CENTER_LEFT" prefHeight="62.0" prefWidth="320.0">
<children>
<TextField fx:id="textField2" editable="false" prefHeight="25.0" prefWidth="210.0" />
<Button fx:id="setLabel" mnemonicParsing="false" onAction="#setInfoTextField2" text="Set Label">
<HBox.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</HBox.margin>
</Button>
</children>
<VBox.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</VBox.margin>
</HBox>
</children>
</VBox>
ich habe schon versucht die Deklaration "Controller2 controller2;" in die initialize() Methode zu schreiben, bringt aber auch nichts.
Die NPE kommt in der Zeile
Java:
textField2.setText(controller1.textField1.getText());
Was ich in dem o.g. Thread nicht ganz verstanden habe ... muss ich in den .fxml Dateien noch includes einbauen? Wenn ja, wo oder geht das auch über den SceneBuilder?
Gruß
Ralf