title: How do I Change FXML Controller Variable Values in JavaFX before Showing Window?
body: <p>I want to change the labels and text in a popup <code>FXML</code> window before it is shown. This is being done because all of the <strong>Help</strong> items will be very similar and I wanted to make a template <code>FXML</code> and then change the values of the labels and text area accordingly to reduce coding.  </p>
  
  <p>I'm surprised I haven't come across a template method in <code>JavaFX</code> though. If there's a better way to go about this, please do suggest it.</p>
  
  <p>For the task at hand, I have the following:</p>
  
  <pre><code>@FXML
  private void documentationAction(ActionEvent action) throws IOException {
      Stage dialogue = new Stage();
      Parent root = null;
      FXMLLoader loader = new FXMLLoader();
      root = loader.load(getClass().getResource("dialogues/dialogue.fxml"));
      Scene scene = new Scene(root);
      /*
       * change text values in title (Label) and text (TextArea)
       * and change the behavior of the findMore button
       */
      dialogue.setTitle("Documentation");
      dialogue.setScene(scene);
      dialogue.show();
  }
  </code></pre>
  
  <p>I would like to be able to change variables inside the <code>FXM</code>L file, for which I've made <code>getters</code> and <code>setters</code> in the controller class, but I can't figure how to do this.  </p>
  
  <p>Is there a way?  It seems like it would be necessary for changing information between windows in multi-windowed applications, so I'm sure there's something simple that I'm missing.</p>
  
  <p>UPDATE
  Code for controller:</p>
  
  <pre><code>public class DialogueController implements Initializable {
  
      @FXML
      private Button more;
      @FXML
      private Button close;
      @FXML
      private TextArea text;
      @FXML
      private Label title;
  
      public TextArea getText() {
          return text;
      }
  
      public void setText(String text) {
          this.text.setText(text);
      }
  
      public Label getTitle() {
          return title;
      }
  
      public void setTitle(String text) {
          this.title.setText(text);
      }
  
      @FXML
      public void closeAction(ActionEvent action) {
          // get a handle to the stage
          Stage stage = (Stage) close.getScene().getWindow();
          // do what you have to do
          stage.close();
      }
  
      @FXML
      public void moreAction(ActionEvent action) {
      }
  
      @FXML
      public void makeDocumentation(ActionEvent action) {
          this.title.setText("Documentation");
      }
  
      /**
       * Initializes the controller class.
       */
      @Override
      public void initialize(URL url, ResourceBundle rb) {
      }
  }
  </code></pre>
  
  <p>Full Dialogue FXML</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
  
  &lt;?import java.lang.*?&gt;
  &lt;?import java.net.*?&gt;
  &lt;?import java.util.*?&gt;
  &lt;?import javafx.geometry.*?&gt;
  &lt;?import javafx.scene.*?&gt;
  &lt;?import javafx.scene.control.*?&gt;
  &lt;?import javafx.scene.layout.*?&gt;
  
  &lt;AnchorPane id="AnchorPane" padding="$x1" prefHeight="500.0" prefWidth="400.0" styleClass="mainFxmlClass" xmlns:fx="http://javafx.com/fxml" fx:controller="pdbpro.dialogues.DialogueController"&gt;
    &lt;children&gt;
      &lt;GridPane alignment="CENTER" prefHeight="400.0" prefWidth="600.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"&gt;
        &lt;children&gt;
          &lt;Label fx:id="title" alignment="CENTER_LEFT" prefWidth="-1.0" styleClass="title" text="Title" underline="false" visible="true" GridPane.columnIndex="0" GridPane.rowIndex="0"&gt;
            &lt;GridPane.margin&gt;
              &lt;Insets fx:id="x1" /&gt;
            &lt;/GridPane.margin&gt;
          &lt;/Label&gt;
          &lt;TextArea fx:id="text" editable="false" focusTraversable="false" prefWidth="200.0" wrapText="true" GridPane.columnIndex="0" GridPane.rowIndex="1"&gt;
            &lt;GridPane.margin&gt;
              &lt;Insets bottom="24.0" left="15.0" right="15.0" /&gt;
            &lt;/GridPane.margin&gt;
          &lt;/TextArea&gt;
          &lt;ToolBar GridPane.columnIndex="0" GridPane.rowIndex="2"&gt;
            &lt;items&gt;
              &lt;Button fx:id="more" mnemonicParsing="false" text="Find more" /&gt;
              &lt;Button fx:id="close" mnemonicParsing="false" onAction="#closeAction" text="Close" /&gt;
            &lt;/items&gt;
            &lt;GridPane.margin&gt;
              &lt;Insets bottom="14.0" /&gt;
            &lt;/GridPane.margin&gt;
          &lt;/ToolBar&gt;
        &lt;/children&gt;
        &lt;columnConstraints&gt;
          &lt;ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /&gt;
        &lt;/columnConstraints&gt;
        &lt;padding&gt;
          &lt;Insets fx:id="x1" /&gt;
        &lt;/padding&gt;
        &lt;rowConstraints&gt;
          &lt;RowConstraints maxHeight="60.0" minHeight="60.0" prefHeight="60.0" valignment="CENTER" vgrow="NEVER" /&gt;
          &lt;RowConstraints maxHeight="1.7976931348623157E308" minHeight="50.0" prefHeight="0.0" vgrow="ALWAYS" /&gt;
          &lt;RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /&gt;
        &lt;/rowConstraints&gt;
      &lt;/GridPane&gt;
    &lt;/children&gt;
    &lt;stylesheets&gt;
      &lt;URL value="@dialogue.css" /&gt;
    &lt;/stylesheets&gt;
  &lt;/AnchorPane&gt;
  </code></pre>
  
  <p>Full stack trace of error at these lines</p>
  
  <pre><code>FXMLLoader loader = new FXMLLoader();
  Parent root = loader.load(getClass().getResource("dialogues/dialogue.fxml"));
  DialogueController dc = loader.getController();
  dc.makeDocumentation(); //ERROR
  Scene scene = new Scene(root);
  
  
  java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
      at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1440)
      at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:69)
      at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217)
      at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
      at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53)
      at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:28)
      at javafx.event.Event.fireEvent(Event.java:171)
      at javafx.scene.control.MenuItem.fire(MenuItem.java:456)
      at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer.doSelect(ContextMenuContent.java:1188)
      at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer$6.handle(ContextMenuContent.java:1139)
      at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer$6.handle(ContextMenuContent.java:1137)
      at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:69)
      at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217)
      at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)
      at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
      at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
      at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
      at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53)
      at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:33)
      at javafx.event.Event.fireEvent(Event.java:171)
      at javafx.scene.Scene$MouseHandler.process(Scene.java:3324)
      at javafx.scene.Scene$MouseHandler.process(Scene.java:3164)
      at javafx.scene.Scene$MouseHandler.access$1900(Scene.java:3119)
      at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1559)
      at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2261)
      at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:228)
      at com.sun.glass.ui.View.handleMouseEvent(View.java:528)
      at com.sun.glass.ui.View.notifyMouse(View.java:922)
      at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
      at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29)
      at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73)
      at java.lang.Thread.run(Thread.java:722)
  Caused by: java.lang.reflect.InvocationTargetException
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:601)
      at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1435)
      ... 37 more
  Caused by: java.lang.NullPointerException
      at pdbpro.MainController.documentationAction(MainController.java:82)
      ... 42 more
  </code></pre>