Created
January 24, 2016 01:52
-
-
Save ahn94/f92a5854eedcde4be520 to your computer and use it in GitHub Desktop.
FXML How to get controller class
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
The two easiest ways of doing it for small applications are : | |
Do not specify the fx:controller in the fxml. Create a controller instance by passing data to it and then pass it to the FXMLLoader. | |
Specify the fx:controller in the fxml. Fetch the controller instance from the FXMLLoader and pass the data to the controller. | |
The following are the examples for both the above said types. Each of the example have 3 components : | |
FXML - The FXML file, which doesn't have the fx:controller declaration for the first type and has it for the second type. | |
Controller - Has a constructor for the first type. Has setter methods for the second type. | |
Main - Used for loading FXML and pass data to the controller. For first case, it sets the controller to FXMLLoader. While in second, it fetches the controller from the FXMLLoader. | |
1. Create a controller instance manually | |
FXML - Do not specify the fx:controller | |
<?xml version="1.0" encoding="UTF-8"?> | |
<?import javafx.scene.layout.FlowPane?> | |
<?import javafx.scene.control.Label?> | |
<FlowPane fx:id="root" xmlns:fx="http://javafx.com/fxml"> | |
<children> | |
<Label fx:id="firstName" text="" /> | |
<Label fx:id="lastName" text="" /> | |
</children> | |
</FlowPane> | |
Controller - create a Constructor to accept default values | |
import javafx.beans.property.SimpleStringProperty; | |
import javafx.beans.property.StringProperty; | |
import javafx.fxml.FXML; | |
import javafx.fxml.Initializable; | |
import javafx.scene.control.Label; | |
import java.net.URL; | |
import java.util.ResourceBundle; | |
public class SampleController implements Initializable { | |
private StringProperty firstNameString = new SimpleStringProperty(); | |
private StringProperty lastNameString = new SimpleStringProperty(); | |
/** | |
* Accepts the firstName, lastName and stores them to specific instance variables | |
* | |
* @param firstName | |
* @param lastName | |
*/ | |
public SampleController(String firstName, String lastName) { | |
firstNameString.set(firstName); | |
lastNameString.set(lastName); | |
} | |
@FXML | |
Label firstName; | |
@FXML | |
Label lastName; | |
@Override | |
public void initialize(URL location, ResourceBundle resources) { | |
firstName.setText(firstNameString.get()); | |
lastName.setText(lastNameString.get()); | |
} | |
} | |
Main - Create a Controller instance, by passing value into it and then pass it to the FXMLLoader | |
import javafx.application.Application; | |
import javafx.fxml.FXMLLoader; | |
import javafx.scene.Scene; | |
import javafx.scene.layout.FlowPane; | |
import javafx.stage.Stage; | |
public class Main extends Application { | |
@Override | |
public void start(Stage primaryStage) throws Exception { | |
FXMLLoader loader = new FXMLLoader(getClass().getResource("Sample.fxml")); | |
// Create a controller instance | |
SampleController controller = new SampleController("itachi", "uchiha"); | |
// Set it in the FXMLLoader | |
loader.setController(controller); | |
FlowPane flowPane = loader.load(); | |
Scene scene = new Scene(flowPane, 200, 200); | |
primaryStage.setScene(scene); | |
primaryStage.show(); | |
} | |
public static void main(String[] args) { | |
launch(args); | |
} | |
} | |
2. Fetch a controller instance from FXMLLoader | |
FXML - Has specified the fx:controller | |
<?xml version="1.0" encoding="UTF-8"?> | |
<?import javafx.scene.layout.FlowPane?> | |
<?import javafx.scene.control.Label?> | |
<!-- Controller Specified --> | |
<FlowPane fx:id="root" xmlns:fx="http://javafx.com/fxml" fx:controller="SampleController"> | |
<children> | |
<Label fx:id="firstName" text="" /> | |
<Label fx:id="lastName" text="" /> | |
</children> | |
</FlowPane> | |
Controller - Has Setter methods to accept input | |
import javafx.fxml.FXML; | |
import javafx.fxml.Initializable; | |
import javafx.scene.control.Label; | |
import java.net.URL; | |
import java.util.ResourceBundle; | |
public class SampleController implements Initializable { | |
@FXML | |
Label firstName; | |
@FXML | |
Label lastName; | |
@Override | |
public void initialize(URL location, ResourceBundle resources) { | |
} | |
/** | |
* Accepts a String and sets it to the firstName Label | |
* | |
* @param firstNameString | |
*/ | |
public void setFirstName(String firstNameString) { | |
firstName.setText(firstNameString); | |
} | |
/** | |
* Accepts a String and sets it to the lastName Label | |
* | |
* @param lastNameString | |
*/ | |
public void setLastName(String lastNameString) { | |
lastName.setText(lastNameString); | |
} | |
} | |
Main - Fetches the Controller instance from FXMLLoader after calling to load(). Calls the setter methods to pass data. | |
import javafx.application.Application; | |
import javafx.fxml.FXMLLoader; | |
import javafx.scene.Scene; | |
import javafx.scene.layout.FlowPane; | |
import javafx.stage.Stage; | |
public class Main extends Application { | |
@Override | |
public void start(Stage primaryStage) throws Exception { | |
FXMLLoader loader = new FXMLLoader(getClass().getResource("Sample.fxml")); | |
FlowPane flowPane = loader.load(); | |
// Get the Controller from the FXMLLoader | |
SampleController controller = loader.getController(); | |
// Set data in the controller | |
controller.setFirstName("itachi"); | |
controller.setLastName("uchiha"); | |
Scene scene = new Scene(flowPane, 200, 200); | |
primaryStage.setScene(scene); | |
primaryStage.show(); | |
} | |
public static void main(String[] args) { | |
launch(args); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment