JavaFX - Penanganan Acara
Di JavaFX, kami dapat mengembangkan aplikasi GUI, aplikasi web, dan aplikasi grafis. Dalam aplikasi seperti itu, setiap kali pengguna berinteraksi dengan aplikasi (node), sebuah peristiwa dikatakan telah terjadi.
Misalnya, mengklik tombol, menggerakkan mouse, memasukkan karakter melalui keyboard, memilih item dari daftar, menggulir halaman adalah aktivitas yang menyebabkan suatu peristiwa terjadi.
Jenis Peristiwa
Peristiwa secara luas dapat diklasifikasikan ke dalam dua kategori berikut -
Foreground Events- Peristiwa yang membutuhkan interaksi langsung dari pengguna. Mereka dihasilkan sebagai konsekuensi dari seseorang yang berinteraksi dengan komponen grafis dalam Antarmuka Pengguna Grafis. Misalnya, mengklik tombol, menggerakkan mouse, memasukkan karakter melalui keyboard, memilih item dari daftar, menggulir halaman, dll.
Background Events- Peristiwa yang membutuhkan interaksi pengguna akhir dikenal sebagai peristiwa latar belakang. Gangguan sistem operasi, kegagalan perangkat keras atau perangkat lunak, waktu kedaluwarsa, penyelesaian operasi adalah contoh peristiwa latar belakang.
Acara di JavaFX
JavaFX menyediakan dukungan untuk menangani berbagai jenis acara. Kelas bernamaEvent dari paket javafx.event adalah kelas dasar untuk suatu acara.
Sebuah contoh dari salah satu subkelasnya adalah sebuah acara. JavaFX menyediakan berbagai macam acara. Beberapa di antaranya tercantum di bawah ini.
Mouse Event- Ini adalah peristiwa input yang terjadi saat mouse diklik. Itu diwakili oleh kelas bernamaMouseEvent. Ini mencakup tindakan seperti mengklik mouse, menekan mouse, melepas mouse, menggerakkan mouse, memasukkan target mouse, target keluar mouse, dll.
Key Event- Ini adalah peristiwa input yang menunjukkan penekanan tombol terjadi pada node. Itu diwakili oleh kelas bernamaKeyEvent. Acara ini mencakup tindakan seperti tombol ditekan, kunci dilepaskan dan tombol diketik.
Drag Event- Ini adalah peristiwa input yang terjadi saat mouse ditarik. Itu diwakili oleh kelas bernamaDragEvent. Ini termasuk tindakan seperti seret masuk, seret turun, seret masuk target, seret keluar target, seret, dll.
Window Event- Ini adalah acara yang terkait dengan jendela yang menampilkan / menyembunyikan tindakan. Itu diwakili oleh kelas bernamaWindowEvent. Ini termasuk tindakan seperti menyembunyikan jendela, jendela ditampilkan, jendela tersembunyi, menampilkan jendela, dll.
Penanganan Acara
Penanganan Peristiwa adalah mekanisme yang mengontrol peristiwa dan memutuskan apa yang harus terjadi, jika peristiwa terjadi. Mekanisme ini memiliki kode yang dikenal sebagai pengendali kejadian yang dijalankan ketika suatu kejadian terjadi.
JavaFX menyediakan penangan dan filter untuk menangani acara. Di JavaFX setiap acara memiliki -
Target- Node tempat terjadinya suatu peristiwa. Target bisa berupa jendela, pemandangan, dan simpul.
Source- Sumber tempat acara dibuat akan menjadi sumber acara. Dalam skenario di atas, mouse adalah sumber acara.
Type- Jenis acara yang terjadi; dalam kasus peristiwa mouse - mouse ditekan, mouse dilepaskan adalah jenis peristiwa.
Asumsikan bahwa kita memiliki aplikasi yang memiliki Circle, Stop and Play Buttons yang disisipkan menggunakan objek grup sebagai berikut -
Jika Anda mengklik tombol putar, sumbernya adalah mouse, node target adalah tombol putar, dan jenis acara yang dihasilkan adalah klik mouse.
Fase Penanganan Event di JavaFX
Setiap kali sebuah acara dibuat, JavaFX mengalami fase berikut.
Konstruksi Rute
Setiap kali suatu peristiwa dibuat, rute default / awal dari peristiwa tersebut ditentukan oleh konstruksi file Event Dispatch chain. Ini adalah jalur dari tahapan ke Node sumber.
Berikut ini adalah rantai pengiriman acara untuk acara yang dihasilkan, ketika kami mengklik tombol putar dalam skenario di atas.
Fase Penangkapan Peristiwa
Setelah pembangunan rantai pengiriman acara, simpul akar aplikasi mengirimkan acara tersebut. Peristiwa ini berjalan ke semua node dalam rantai pengiriman (dari atas ke bawah). Jika salah satu node ini memiliki filefilterterdaftar untuk acara yang dihasilkan, itu akan dieksekusi. Jika tidak ada node dalam rantai pengiriman yang memiliki filter untuk acara yang dihasilkan, maka itu diteruskan ke node target dan akhirnya node target memproses acara tersebut.
Fase Gelembung Acara
Dalam fase gelembung acara, acara tersebut berjalan dari node target ke node panggung (bawah ke atas). Jika salah satu node dalam rantai pengiriman acara memiliki filehandlerterdaftar untuk acara yang dihasilkan, itu akan dieksekusi. Jika tidak ada dari node ini yang memiliki penangan untuk menangani event tersebut, maka event tersebut mencapai node root dan akhirnya proses akan selesai.
Penangan dan Filter Acara
Filter dan penangan peristiwa adalah yang berisi logika aplikasi untuk memproses peristiwa. Sebuah node dapat mendaftar ke lebih dari satu handler / filter. Dalam kasus node induk-anak, Anda dapat memberikan filter / penangan umum kepada orang tua, yang diproses sebagai default untuk semua node anak.
Seperti yang disebutkan di atas, selama acara, pemrosesan adalah filter yang dijalankan dan selama fase gelembung, penangan dijalankan. Semua penangan dan filter menerapkan antarmukaEventHandler dari paket javafx.event.
Menambah dan Menghapus Filter Peristiwa
Untuk menambahkan filter peristiwa ke node, Anda perlu mendaftarkan filter ini menggunakan metode addEventFilter() dari Node kelas.
//Creating the mouse event handler
EventHandler<MouseEvent> eventHandler = new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
System.out.println("Hello World");
circle.setFill(Color.DARKSLATEBLUE);
}
};
//Adding event Filter
Circle.addEventFilter(MouseEvent.MOUSE_CLICKED, eventHandler);
Dengan cara yang sama, Anda bisa menghapus filter menggunakan metode removeEventFilter () seperti yang ditunjukkan di bawah ini -
circle.removeEventFilter(MouseEvent.MOUSE_CLICKED, eventHandler);
Contoh Penanganan Acara
Berikut adalah contoh yang mendemonstrasikan penanganan event di JavaFX menggunakan filter event. Simpan kode ini dalam file dengan namaEventFiltersExample.java.
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class EventFiltersExample extends Application {
@Override
public void start(Stage stage) {
//Drawing a Circle
Circle circle = new Circle();
//Setting the position of the circle
circle.setCenterX(300.0f);
circle.setCenterY(135.0f);
//Setting the radius of the circle
circle.setRadius(25.0f);
//Setting the color of the circle
circle.setFill(Color.BROWN);
//Setting the stroke width of the circle
circle.setStrokeWidth(20);
//Setting the text
Text text = new Text("Click on the circle to change its color");
//Setting the font of the text
text.setFont(Font.font(null, FontWeight.BOLD, 15));
//Setting the color of the text
text.setFill(Color.CRIMSON);
//setting the position of the text
text.setX(150);
text.setY(50);
//Creating the mouse event handler
EventHandler<MouseEvent> eventHandler = new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
System.out.println("Hello World");
circle.setFill(Color.DARKSLATEBLUE);
}
};
//Registering the event filter
circle.addEventFilter(MouseEvent.MOUSE_CLICKED, eventHandler);
//Creating a Group object
Group root = new Group(circle, text);
//Creating a scene object
Scene scene = new Scene(root, 600, 300);
//Setting the fill color to the scene
scene.setFill(Color.LAVENDER);
//Setting title to the Stage
stage.setTitle("Event Filters Example");
//Adding scene to the stage
stage.setScene(scene);
//Displaying the contents of the stage
stage.show();
}
public static void main(String args[]){
launch(args);
}
}
Kompilasi dan jalankan file java yang disimpan dari command prompt menggunakan perintah berikut.
javac EventFiltersExample.java
java EventFiltersExample
Saat menjalankan, program di atas menghasilkan jendela JavaFX seperti yang ditunjukkan di bawah ini.
Menambah dan Menghapus Penangan Acara
Untuk menambahkan event handler ke node, Anda perlu mendaftarkan handler ini menggunakan metode addEventHandler() dari Node kelas seperti yang ditunjukkan di bawah ini.
//Creating the mouse event handler
EventHandler<javafx.scene.input.MouseEvent> eventHandler =
new EventHandler<javafx.scene.input.MouseEvent>() {
@Override
public void handle(javafx.scene.input.MouseEvent e) {
System.out.println("Hello World");
circle.setFill(Color.DARKSLATEBLUE);
}
};
//Adding the event handler
circle.addEventHandler(javafx.scene.input.MouseEvent.MOUSE_CLICKED, eventHandler);
Dengan cara yang sama, Anda bisa menghapus pengendali kejadian menggunakan metode removeEventHandler () seperti yang ditunjukkan di bawah ini -
circle.removeEventHandler(MouseEvent.MOUSE_CLICKED, eventHandler);
Contoh
Program berikut adalah contoh yang mendemonstrasikan penanganan event di JavaFX menggunakan event handler.
Simpan kode ini dalam file dengan nama EventHandlersExample.java.
import javafx.animation.RotateTransition;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyEvent;
import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.Box;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;
import javafx.util.Duration;
public class EventHandlersExample extends Application {
@Override
public void start(Stage stage) {
//Drawing a Box
Box box = new Box();
//Setting the properties of the Box
box.setWidth(150.0);
box.setHeight(150.0);
box.setDepth(100.0);
//Setting the position of the box
box.setTranslateX(350);
box.setTranslateY(150);
box.setTranslateZ(50);
//Setting the text
Text text = new Text("Type any letter to rotate the box,
and click on the box to stop the rotation");
//Setting the font of the text
text.setFont(Font.font(null, FontWeight.BOLD, 15));
//Setting the color of the text
text.setFill(Color.CRIMSON);
//setting the position of the text
text.setX(20);
text.setY(50);
//Setting the material of the box
PhongMaterial material = new PhongMaterial();
material.setDiffuseColor(Color.DARKSLATEBLUE);
//Setting the diffuse color material to box
box.setMaterial(material);
//Setting the rotation animation to the box
RotateTransition rotateTransition = new RotateTransition();
//Setting the duration for the transition
rotateTransition.setDuration(Duration.millis(1000));
//Setting the node for the transition
rotateTransition.setNode(box);
//Setting the axis of the rotation
rotateTransition.setAxis(Rotate.Y_AXIS);
//Setting the angle of the rotation
rotateTransition.setByAngle(360);
//Setting the cycle count for the transition
rotateTransition.setCycleCount(50);
//Setting auto reverse value to false
rotateTransition.setAutoReverse(false);
//Creating a text filed
TextField textField = new TextField();
//Setting the position of the text field
textField.setLayoutX(50);
textField.setLayoutY(100);
//Handling the key typed event
EventHandler<KeyEvent> eventHandlerTextField = new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
//Playing the animation
rotateTransition.play();
}
};
//Adding an event handler to the text feld
textField.addEventHandler(KeyEvent.KEY_TYPED, eventHandlerTextField);
//Handling the mouse clicked event(on box)
EventHandler<javafx.scene.input.MouseEvent> eventHandlerBox =
new EventHandler<javafx.scene.input.MouseEvent>() {
@Override
public void handle(javafx.scene.input.MouseEvent e) {
rotateTransition.stop();
}
};
//Adding the event handler to the box
box.addEventHandler(javafx.scene.input.MouseEvent.MOUSE_CLICKED, eventHandlerBox);
//Creating a Group object
Group root = new Group(box, textField, text);
//Creating a scene object
Scene scene = new Scene(root, 600, 300);
//Setting camera
PerspectiveCamera camera = new PerspectiveCamera(false);
camera.setTranslateX(0);
camera.setTranslateY(0);
camera.setTranslateZ(0);
scene.setCamera(camera);
//Setting title to the Stage
stage.setTitle("Event Handlers Example");
//Adding scene to the stage
stage.setScene(scene);
//Displaying the contents of the stage
stage.show();
}
public static void main(String args[]){
launch(args);
}
}
Kompilasi dan jalankan file java yang disimpan dari command prompt menggunakan perintah berikut.
javac EventHandlersExample.java
java EventHandlersExample
Saat menjalankan, program di atas menghasilkan jendela JavaFX yang menampilkan bidang teks dan kotak 3D seperti yang ditunjukkan di bawah ini -
Di sini, jika Anda mengetik huruf di bidang teks, kotak 3D mulai berputar di sepanjang sumbu x. Jika Anda mengklik kotak itu lagi, rotasi berhenti.
Menggunakan Metode Kemudahan untuk Penanganan Acara
Beberapa kelas di JavaFX mendefinisikan properti penanganan kejadian. Dengan menyetel nilai ke properti ini menggunakan metode penyetelnya masing-masing, Anda bisa mendaftar ke pengendali kejadian. Metode ini dikenal sebagai metode kenyamanan.
Sebagian besar metode ini ada di kelas seperti Node, Scene, Window, dll., Dan tersedia untuk semua sub kelasnya.
Misalnya, untuk menambahkan event listener mouse ke sebuah tombol, Anda dapat menggunakan metode praktis setOnMouseClicked() seperti gambar dibawah.
playButton.setOnMouseClicked((new EventHandler<MouseEvent>() {
public void handle(MouseEvent event) {
System.out.println("Hello World");
pathTransition.play();
}
}));
Contoh
Program berikut adalah contoh yang mendemonstrasikan penanganan event di JavaFX menggunakan metode kemudahan.
Simpan kode ini dalam file dengan nama ConvinienceMethodsExample.java.
import javafx.animation.PathTransition;
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.LineTo;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.Path;
import javafx.stage.Stage;
import javafx.util.Duration;
public class ConvinienceMethodsExample extends Application {
@Override
public void start(Stage stage) {
//Drawing a Circle
Circle circle = new Circle();
//Setting the position of the circle
circle.setCenterX(300.0f);
circle.setCenterY(135.0f);
//Setting the radius of the circle
circle.setRadius(25.0f);
//Setting the color of the circle
circle.setFill(Color.BROWN);
//Setting the stroke width of the circle
circle.setStrokeWidth(20);
//Creating a Path
Path path = new Path();
//Moving to the staring point
MoveTo moveTo = new MoveTo(208, 71);
//Creating 1st line
LineTo line1 = new LineTo(421, 161);
//Creating 2nd line
LineTo line2 = new LineTo(226,232);
//Creating 3rd line
LineTo line3 = new LineTo(332,52);
//Creating 4th line
LineTo line4 = new LineTo(369, 250);
//Creating 5th line
LineTo line5 = new LineTo(208, 71);
//Adding all the elements to the path
path.getElements().add(moveTo);
path.getElements().addAll(line1, line2, line3, line4, line5);
//Creating the path transition
PathTransition pathTransition = new PathTransition();
//Setting the duration of the transition
pathTransition.setDuration(Duration.millis(1000));
//Setting the node for the transition
pathTransition.setNode(circle);
//Setting the path for the transition
pathTransition.setPath(path);
//Setting the orientation of the path
pathTransition.setOrientation(
PathTransition.OrientationType.ORTHOGONAL_TO_TAN GENT);
//Setting the cycle count for the transition
pathTransition.setCycleCount(50);
//Setting auto reverse value to true
pathTransition.setAutoReverse(false);
//Creating play button
Button playButton = new Button("Play");
playButton.setLayoutX(300);
playButton.setLayoutY(250);
circle.setOnMouseClicked (new EventHandler<javafx.scene.input.MouseEvent>() {
@Override
public void handle(javafx.scene.input.MouseEvent e) {
System.out.println("Hello World");
circle.setFill(Color.DARKSLATEBLUE);
}
});
playButton.setOnMouseClicked((new EventHandler<MouseEvent>() {
public void handle(MouseEvent event) {
System.out.println("Hello World");
pathTransition.play();
}
}));
//Creating stop button
Button stopButton = new Button("stop");
stopButton.setLayoutX(250);
stopButton.setLayoutY(250);
stopButton.setOnMouseClicked((new EventHandler<MouseEvent>() {
public void handle(MouseEvent event) {
System.out.println("Hello World");
pathTransition.stop();
}
}));
//Creating a Group object
Group root = new Group(circle, playButton, stopButton);
//Creating a scene object
Scene scene = new Scene(root, 600, 300);
scene.setFill(Color.LAVENDER);
//Setting title to the Stage
stage.setTitle("Convenience Methods Example");
//Adding scene to the stage
stage.setScene(scene);
//Displaying the contents of the stage
stage.show();
}
public static void main(String args[]){
launch(args);
}
}
Kompilasi dan jalankan file java yang disimpan dari command prompt menggunakan perintah berikut.
javac ConvinienceMethodsExample.java
java ConvinienceMethodsExample
Saat menjalankan, program di atas menghasilkan jendela JavaFX seperti yang ditunjukkan di bawah ini. Di sini klik tombol putar untuk memulai animasi dan klik tombol berhenti untuk menghentikan animasi.