JavaFX z Arią - powrót do strony głównej

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:

Okno aplikacji
Okno aplikacji po kliknięciu przycisku ‘Tak’

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.