10 Oktober 2020
Tutorial JavaFX Penanganan Event

Melanjutkan tutorial sebelumnya, tulisan kali ini akan membahas tentang bagaimana menangani event dalam aplikasi JavaFX. Sebagai pengantar, event dalam pemrograman adalah kejadian atau aksi yang dipicu oleh user, seperti menekan tombol tertentu pada keyboard, menggerakkan atau meng-click mouse dan lain sebagainya.

Menggunakan Metode setOnAction

Pada tutorial sebelumnya, kita telah belajar membuat program dengan JavaFX. Program tersebut hanya sebatas menampilkan jendela program disertai beberapa komponen didalamnya.

Aplikasi JavaFX

Disini kita akan menambahkan event kedalam tombol yang akan dipicu pada saat tombol tersebut diklik. Untuk menambahkan event, kita cukup memanggil metode setOnAction() (lihat dokumentasi) dari komponen Button.

Metode ini dipanggil dengan menyebutkan implementasi dari interface EventHandler<ActionEvent> (lihat dokumentasi). Karena EventHandler adalah functional interface , implementasinya bisa langsung disebutkan dalam pemanggilan metode dalam bentuk ekspresi lambda.

tombol.setOnAction(e -> {
    // kode berikut
});

Sebagai contoh, program akan menampilkan nama yang diinput oleh user pada komponen TextField. Pertama, kita ambil nilai yang diinput oleh user dengan menggunakan metode getText(), nilai tersebut kita simpan dalam variabel String nama. Berikutnya, kita tinggal tampilkan nilai dari variabel tersebut menggunakan metode println().

tombol.setOnAction(e -> {
    String nama = tfNama.getText();
    System.out.println("Nama yang anda masukkan adalah : " + nama);
});

Berikut ini adalah ilustrasi dari proses eksekusi program

Aplikasi JavaFX

Menggunakan Metode setOnKeyTyped

Untuk contoh kali ini, kita akan menambahkan event kedalam komponen TextField yang akan dipicu saat user mengetikkan text ke dalam komponen tersebut. Metode yang digunakan disini adalah setOnKeyTyped() yang menggunakan argumen EventHandler<? super KeyEvent>. Sama seperti sebelumnya, EventHandler merupakan functional interface. Yang artinya, implementasi dari interface tersebut bisa langsung disebutkan dalam bentuk ekspresi lambda.

tfNama.setOnKeyTyped(e -> {
    // kode berikut
});

Pada contoh berikut ini, tombol pada jendela program akan berfungsi jika nama yang diketikkan adalah budiman. Jika user memasukkan nama selain budiman, tombol tersebut tidak bisa digunakan.

Disini kita akan melakukan beberapa modifikasi dalam kode program. Yang pertama, kita perlu memindahkan deklarasi kedua variabel komponen TextField dan Button dari dalam metode start(), dan menjadikan keduanya sebagai member dari class.

public class Main extends Application {

    private TextField tfNama;
    private Button tombol;

}

Secara default, tombol berada dalam kondisi non-aktif (disabled). Untuk menonaktifkan tombol, kita gunakan metode setDisable() yang menggunakan argumen dengan tipe boolean.

tombol = new Button("Click Disini");
tombol.setDisable(true);
tombol.setOnAction(e -> System.out.println("selamat datang budiman"));

Untuk mengaktifkan tombol, program akan mengevaluasi text yang diketikkan dalam komponen TextField menggunakan metode equals() yang akan mengembalikan nilai boolean. Tombol diaktifkan dengan memanggil metode setDisable(), dengan menggunakan parameter nilai inversi boolean dari metode equals() tersebut.

tfNama = new TextField();
tfNama.setOnKeyTyped(e -> {
    String nama = tfNama.getText();
    System.out.println("Nama anda : " + nama);
    tombol.setDisable(!nama.equals("budiman"));
});

Berikut ini adalah ilustrasi dari eksekusi kode program :

Aplikasi JavaFX

Adapun kode program selengkapnya adalah sebagai berikut :

package latihan;

import javafx.application.Application;
import javafx.scene.control.Label;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.geometry.Insets;

public class Main extends Application {

    TextField tfNama;
    Button tombol;

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

    public void start(Stage primaryStage) {
        Label lblNama = new Label("Masukkan Nama Anda : ");
        tfNama = new TextField();
        tfNama.setOnKeyTyped(e -> {
            String nama = tfNama.getText();
            System.out.println("Nama anda : " + nama);
            tombol.setDisable(!nama.equals("budiman"));
        });
        tombol = new Button("Click Disini");
        tombol.setDisable(true);
        tombol.setOnAction(e -> {
            String nama = tfNama.getText();
            System.out.println("Nama yang anda masukkan adalah : " + nama);
        });

        VBox root = new VBox(10, lblNama, tfNama, tombol);
        root.setPadding(new Insets(10));

        Scene scene = new Scene(root, 400, 400);

        primaryStage.setScene(scene);
        primaryStage.setTitle("Latihan JavaFX");
        primaryStage.setMinWidth(400);
        primaryStage.setMinHeight(400);
        primaryStage.centerOnScreen();
        primaryStage.show();
    }

}