W poprzednim poście zaprezentowaliśmy trzy przyciski, które po kliknięciu nic nie robią. Aby to zmienić musimy dodać uchwyty zdarzeń.
Aplikacja JavaFX bez FXML
Po kliknięciu przycisku na etykietce pojawia się odpowiedni napis.
Listing03_handlers.java
package codes; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class Listing03_handlers extends Application { private Label lab1; public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage) { try { VBox root = new VBox(); HBox hbox = new HBox(); lab1 = new Label(); lab1.setText("Twoja decyzja?"); Button but1 = new Button("Tak"); but1.setOnAction(this::showText1); Button but2 = new Button("Nie"); but2.setOnAction(this::showText2); Button but3 = new Button("Anuluj"); but3.setOnAction(this::showText3); hbox.getChildren().addAll(but1, but2, but3); root.getChildren().addAll(lab1, hbox); Scene scene = new Scene(root, 150, 80); stage.setScene(scene); stage.show(); } catch (Exception e) { e.printStackTrace(); } } public void showText1(ActionEvent e) {lab1.setText("Wybrałeś 'Tak'");} public void showText2(ActionEvent e) {lab1.setText("Wybrałeś 'Nie'"); } public void showText3(ActionEvent e){lab1.setText("Wybrałeś 'Anuluj'"); } }
Po uruchomieniu klasy i kliknięciu przycisku zobaczymy odpowiedni napis:
Aplikacja JavaFX z FXML
Tym razem przygotowujemy trzy pliki.
listing04_controller.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?> <VBox xmlns:fx="http://javafx.com/fxml" fx:controller="codes.Listing04_Controller" > <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> </VBox>
W pliku pojawił się atrybut fx:controller="codes.Listing04_Controller"
pokazujący położenie pliku kontrolera. Kontroler może być tylko jeden. Jeżeli występuje, informacja o nim musi się znaleźć w elemencie root.
Atrybuty przycisku onAction
zawierają odniesienie #showText1
do odpowiedniej metody w kontrolerze.
Listing04_Controller.java
Jest to plik kontrolera.
package codes; import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.layout.HBox; public class Listing04_Controller { @FXML private HBox hbox; @FXML private Label lab1; @FXML private Button but1; @FXML private Button but2; @FXML private Button but3; @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'"); } @FXML private void initialize(){ System.out.println("Wykonałam swoją pracę"); } }
Kontroler musi posiadać konstruktor bezparametrowy jawny lub nie.
W tym kontrolerze zawarta jest informacja na temat uchwytów zdarzeń dla przycisków w scenografie.
Adnotacja @FXML
jest umieszczana jedynie przed prywatnymi lub chronionymi polami albo metodami kontrolera. Dzięki temu FXMLLoader
ma dostęp do tych członków klasy.
Metoda initialize()
nie jest obowiązkowa. Może mieć dowolny atrybut dostępu. Jeśli metoda występuje – jest uruchamiana po załadowaniu całego pliku FXML.
Użycie kontrolera implementującego interfejs Initializable
pokażę w dalszych postach tego tutorialu.
Listing04.java
Klasa uruchamiająca. FXMLLoader
ładuje plik FXML, następnie uruchamia kontroler.
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 Listing04 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/listing04_controller.fxml"); VBox root = fxmlUrl != null ? FXMLLoader.load(fxmlUrl) : new VBox(); Scene scene = new Scene(root, 150, 80); stage.setScene(scene); stage.show(); } catch (Exception e) { e.printStackTrace(); } } }
Po uruchomieniu kodu i kliknięciu przycisku zobaczymy okno aplikacji jak na powyższym rysunku.