How to pass a Variable through JavaFX Application to the Controller?

17,240

First you will have to add the setter and getter in the MyClass (as the var is private) and change it to static:

private static String myVariable;
public String getMyVariable() {
    return myVariable;
}

public void setMyVariable(String myVariable) {
    this.myVariable = myVariable;
}

Then, as the MyClass is static can do:

System.out.println(MyClass.getMyVariable());

Working example:

MyClass.java

import java.net.URL;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.fxml.JavaFXBuilderFactory;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class MyClass extends Application {
    private static String myVariable;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        setMyVariable("Anything");
        URL location = getClass().getResource("MyGui.fxml");
        FXMLLoader fxmlLoader = new FXMLLoader();
        fxmlLoader.setLocation(location);
        fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
        Parent root = FXMLLoader.load(location);
        Scene scene = new Scene(root);
        stage.setTitle("Hello Word");
        stage.setScene(scene);
        stage.show();
    }

    public static String getMyVariable() {
        return myVariable;
    }

    public static void setMyVariable(String myVariable) {
        MyClass.myVariable = myVariable;
    }

}

MyController.java

import java.net.URL;
import java.util.ResourceBundle;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;


public class MyController implements Initializable{
    @FXML Label labelVar;
    @Override
    public void initialize(URL arg0, ResourceBundle arg1) {
        labelVar.setText(labelVar.getText() + MyClass.getMyVariable());

    }

}

MyGui.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="110.0" prefWidth="305.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="MyController">
    <children>
        <Label fx:id="labelVar" layoutX="24.0" layoutY="32.0" prefHeight="17.0" prefWidth="129.0" text="MyVariable = " />
    </children>
</Pane>
Share:
17,240
Artur Rem
Author by

Artur Rem

Updated on June 08, 2022

Comments

  • Artur Rem
    Artur Rem almost 2 years

    I'd like to ask if it is possible to pass a Variable through a JavaFX Class what extends Application to my JavaFx Controller? I am very new to JavaFx and only may need a little kick.

    The goal is to pass a Id from MyClass to MyController.

    My Application class:

    public class MyClass extends Application {
        private String myVariable="Anything";
    
        public static void main(String[] args) {
            launch(args);
        }
    
        @Override
        public void start(Stage stage) throws Exception {
            URL location = getClass().getResource("MyGui.fxml");
    
            FXMLLoader fxmlLoader = new FXMLLoader();
            fxmlLoader.setLocation(location);
            fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
            Parent root = FXMLLoader.load(location);
            Scene scene = new Scene(root);
    
            stage.setTitle(title);
            stage.setScene(scene);
            stage.show();
        }
    }
    

    My Controller:

    public class Controller extends Group implements Binding {
    
    public void initialize(Map<String, Object> namespace, URL location, Resources resources) {
    
    // HERE I'D LIKE TO GET MY VARIABLE LIKE
    System.out.println(myVariable);
    }
    
    @Override
    public List<Handler> getHandlerChain() {
        return null;
    }
    
    @Override
    public void setHandlerChain(List<Handler> chain) {
    }
    
    @Override
    public String getBindingID() {
        return null;
    }
    }