eingespeist Ich habe einen BorderPane (einem MainController zugeordnet), der FXML für BorderPane verwendet <fx:include>
, um ein Label (mit einem Controller StatusBarController) in den unteren Bereich des BorderPane einzubinden. Leider wird der StatusBarController nicht in die MainController-Klasseninstanz eingefügt und ich kann nicht verstehen warum.Subcontroller wird nicht in den Hauptregler
main.fxml: BorderPane mit dem mitgelieferten statusbar
<fx:root type="javafx.scene.layout.BorderPane" fx:id="borderPane" xmlns:fx="http://javafx.com/fxml" fx:controller="com.example.controllers.MainController">
<bottom>
<fx:include source="statusbar.fxml" />
</bottom>
</fx:root>
statusbar.fxml: das Etikett und es zugehörige Steuerung
<Label fx:id="statusbar" text="A label simulating a status bar" xmlns:fx="http://javafx.com/fxml" fx:controller="com.example.controllers.StatusBarController" />
Die MainController mit einem Feld für die StatusBarController :
public class MainController
{
@FXML
private StatusBarController statusbarController; // PROBLEM HERE: I would expect the StatusBarController to be injected but this does not happen!
// Implementing Initializable Interface no longer required on JavaFX 2.2 according to
// http://docs.oracle.com/javafx/2/fxml_get_started/whats_new2.htm
// (I also tested this, the initialize() method is being called)
@SuppressWarnings("unused") // only called by the FXMLLoader
@FXML // This method is called by the FXMLLoader when initialization is complete
private void initialize() {
// initialize your logic here: all @FXML variables will have been injected
assert borderPane != null : "fx:id=\"borderPane\" was not injected: check your FXML file 'main.fxml'.";
System.out.println("MainController initialize()");
//statusbarController.setStatusText("Hello from MainController"); // PROBLEM HERE: this fails because statusbarController is not injected as expected
}
}
Und der Start der Anwendung:
public void start(Stage primaryStage)
{
Parent root = null;
try {
root = FXMLLoader.load(getClass().getResource("/resources/main.fxml"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
primaryStage.setTitle("Demo");
primaryStage.setScene(new Scene(root, 800, 600));
primaryStage.show();
}
Der vollständige Quellcode meiner Probe bei http://codestefan.googlecode.com/svn/trunk/SubcontrollerAccess/ verfügbar ist
Die Frage ist also: Warum ist der StatusBarController nicht in die statusbarController Variable injiziert des MainControllers?
Danke für jeden Hinweis!
Danke, mir war das Benennungsschema für die Controllervariable bekannt, aber ich vermisste das Hinzufügen von fx: id direkt zum fx: include (das macht natürlich auch Sinn, einen allgemeinen FXML-Code von einer konkreten ID zu entkoppeln). Es funktioniert jetzt :-) –
@Sergey, hatte ich das gleiche Problem, und meine Problembehebung war in Ihrem NOTE fx: ID + Controller. ein schöner Fang !!!! Bitte beantworte diese Frage mit deiner Notiz, da sie mein Problem behoben hat. https: // Stapelüberlauf.com/questions/45475209/null-ausnahme-wenn-ich-versuchen-zu-ein-controller-das-ich-übergeben-using-javafx – Moe
@Meine sicher, danke für den Hinweis :) –