SceneBuilder wie auf Attribute zugreifen? Diese sind immer null.

needInput

Mitglied
Zum Problem,
sobald ich das AnchorPane ansprechen möchte erhalte ich eine NullPointer Exception.
Soweit ich weiß regelt JavaFX die Instantiierung der Attribute intern.
Achja und die onCreate() Methode wird in der start - Methode erst am Ende aufgerufen.

Java:
public class Controller {
    @FXML
    AnchorPane mainAnchor;

    public void onCreate(){
        System.out.println(mainAnchor); //liefert immer NULL
        mainAnchor.getStylesheets().add("sample/style.css");
    }

}
Die FXML Datei:
Code:
<AnchorPane id="anchorPaneStyle" fx:id="mainAnchor" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" styleClass="sample/style.css" xmlns="http://javafx.com/javafx/8.0.172-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
   <children>
      <Button mnemonicParsing="false" text="Button" />
   </children>
</AnchorPane>
 
Zeig mal die Instanzierung deines fxml her und wie du auf den Controller zugreifst.
Java:
public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
       Controller controller = new Controller();
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        controller.onCreate();
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}
 
Richtig wäre:
Java:
public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}
Java:
public class Controller {
    @FXML
    AnchorPane mainAnchor;

    @FXML
    public void initialize(){
        System.out.println(mainAnchor); //liefert immer != NULL
        mainAnchor.getStylesheets().add("sample/style.css");
    }
}

Es gibt nämlich eine von FX bereitgestellte initialize Methode, der dir das nach dem Laden ausführt.
Wenn du einen Controller händisch setzen/holen möchtest, brauchst du eine Instanz des FXMLLoader (dazu genug Tutorials im Netz).
 
Besten Dank das funktioniert einwandfrei🙂!
Das einzige was mich jetzt noch stört ist, dass wenn
das Programm ausgeführt wird -> Bild wird im Hintergrund angezeigt.
nur der SceneBuilder ausgeführt wird -> Bild wird nicht im Hintergrund angezeigt.
 

Zurück
Oben