FXML tutorial (15) – tworzenie obiektów (8)
Znacznik <fx:root>
Znacznik <fx:root>
tworzy element, który zostanie wczytany do aplikacji jako element root, o ile może być takim elementem.
Istnieje sporo możliwości utworzenie zarówno elementu jak i zapewnienia stosownego kontrolera. Inne rozwiązania niż pokazane poniżej są omówione w dokumentacji FXML.
Klasa ButtonController.java
Klasa kontrolera
package codes; import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; public class ButtonController extends VBox { @FXML private HBox hbox; @FXML private Label lab1; @FXML private Button but1; @FXML private Button but2; @FXML private Button but3; public ButtonController() { } @FXML private void initialize() { } @FXML private void showText1() { lab1.setText("Wybrałeś 'Tak'"); } @FXML private void showText2() { lab1.setText("Wybrałeś 'Nie'"); } @FXML private void showText3() { lab1.setText("Wybrałeś 'Anuluj'"); } }
Plik listing15_fxroot.fxml
<?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.layout.VBox?> <?import javafx.scene.layout.HBox?> <?import javafx.scene.control.Label?> <?import javafx.scene.control.Button?> <fx:root type="VBox" xmlns:fx="http://javafx.com/fxml"> <Label fx:id="lab1" text="Twoja decyzja?" /> <HBox fx:id="hbox"> <Button fx:id="but1" text="Tak" onAction="#showText1" /> <Button fx:id="but2" text="Nie" onAction="#showText2" /> <Button fx:id="but3" text="Anuluj" onAction="#showText3" /> </HBox> </fx:root>
W tym pliku element onAction
zostaną wyświetlone na czerwono przez analizator składni. Dzieje się tak ponieważ kontroler jest wczytywany z klasy uruchamiającej, a nie z kodu FXML. Kod uruchomi się prawidłowo.
Klasa Listing15_fxroot
Klasa uruchamiająca.
package codes; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.scene.layout.VBox; import javafx.stage.Stage; import java.net.URL; public class Listing15_fxroot extends Application { public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage) { try { URL fxmlUrl = this.getClass().getClassLoader() .getResource("resources/listing15_fxroot.fxml"); FXMLLoader loader = new FXMLLoader(fxmlUrl); VBox root = new ButtonController(); loader.setRoot(root); loader.setController(root); loader.load(); Scene scene = new Scene(root, 150, 80); stage.setScene(scene); stage.show(); } catch (Exception e) { e.printStackTrace(); } } }
Po uruchomieniu zobaczyny: