JAVAFX Adds Dynamic Element to FXML Gridpane

In my FXML, I created gridpane. Now I want to add a dynamic element (for example, a button, text field) by java code (and not by FXML), while I try to do this, I get an error. Please, help.

my FXML:

<AnchorPane fx:controller="tableview.TableViewSample" id="AnchorPane" maxHeight="- Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml"> <children> <GridPane fx:id="greadpane" layoutX="0.0" layoutY="0.0" prefHeight="400.0" prefWidth="600.0"> <columnConstraints> <ColumnConstraints fx:id="col0" hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> </columnConstraints> <rowConstraints> <RowConstraints fx:id="row0" minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> </rowConstraints> </GridPane> </children> </AnchorPane> 

My Java code is:

  public class TableViewSample extends Application { @FXML private GridPane greadpane; public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) throws IOException { Pane myPane = (Pane)FXMLLoader.load(getClass().getResource ("tabviewexamlpe.fxml")); Scene scene = new Scene(myPane); stage.setTitle("Table View "); stage.setWidth(450); stage.setHeight(500); stage.setScene(scene); final Label label = new Label("Address Book"); label.setFont(new Font("Arial", 20)); greadpane.add(label, 0, 0); stage.show(); } } 
+4
source share
2 answers

You get a null pointer because you are trying to perform the operation before stage.show (), so fxml is not yet initialized. don't do dirty things and put your greadPane.add on a separate controller

 public class Controller implements Initializable { @FXML private GridPane greadpane; @Override public void initialize(URL url, ResourceBundle resourceBundle) { final Label label = new Label("Address Book"); label.setFont(new Font("Arial", 20)); greadpane.add(label, 0, 0); } } 

and assign your fxml to this controller. and it will be ok

+11
source

I ran into the same problem and used the Agonist_ tip, but instead of splitting gridPane into a new controller, I just created a thread that starts 10 ms later to execute the code that stage.show () waits for.

 public GameController(Game game) { game.addObserver(this); new Thread() { @Override public void run() { try { Thread.sleep(10); Platform.runLater(() -> { game.startBeginnerRound(); }); } catch (InterruptedException ex) { Logger.getLogger(GameController.class.getName()).log(Level.SEVERE, null, ex); } } }.start(); } 

In this example, gridPane is updated when the observable notifies it, in this case, when game.startBeginnerRound () is executed.

0
source

Source: https://habr.com/ru/post/1487726/


All Articles