JavaFX - Olay İşleme
JavaFX'te GUI uygulamaları, web uygulamaları ve grafik uygulamaları geliştirebiliriz. Bu tür uygulamalarda, bir kullanıcı uygulamayla (düğümler) etkileşim kurduğunda, bir olayın meydana geldiği söylenir.
Örneğin, bir düğmeye tıklamak, fareyi hareket ettirmek, klavyeden bir karakter girmek, listeden bir öğe seçmek, sayfayı kaydırmak bir olayın meydana gelmesine neden olan faaliyetlerdir.
Etkinlik Türleri
Olaylar genel olarak aşağıdaki iki kategoriye ayrılabilir -
Foreground Events- Bir kullanıcının doğrudan etkileşimini gerektiren olaylar. Bir kişinin Grafik Kullanıcı Arayüzündeki grafik bileşenlerle etkileşime girmesinin sonucu olarak oluşturulurlar. Örneğin, bir düğmeye tıklamak, fareyi hareket ettirmek, klavyeden bir karakter girmek, listeden bir öğe seçmek, sayfayı kaydırmak vb.
Background Events- Son kullanıcının etkileşimini gerektiren olaylar, arka plan olayları olarak bilinir. İşletim sistemi kesintileri, donanım veya yazılım arızası, zamanlayıcının sona ermesi, işlemin tamamlanması arka plan olaylarına örnektir.
JavaFX'teki olaylar
JavaFX, çok çeşitli olayları işlemek için destek sağlar. Adlı sınıfEvent paketin javafx.event bir olay için temel sınıftır.
Alt sınıflarından herhangi birinin bir örneği bir olaydır. JavaFX, çok çeşitli etkinlikler sağlar. Bunlardan bazıları aşağıda listelenmiştir.
Mouse Event- Bu, bir fareye tıklandığında meydana gelen bir giriş olayıdır. Adlı sınıf tarafından temsil edilirMouseEvent. Fareye tıklanma, fareye basma, fareyi bırakma, fareyi hareket ettirme, fareyle girilen hedef, fareden çıkılan hedef vb.
Key Event- Bu, bir düğümde meydana gelen tuş vuruşunu gösteren bir giriş olayıdır. Adlı sınıf tarafından temsil edilirKeyEvent. Bu olay, tuşa basılması, tuşun bırakılması ve tuşun yazılması gibi eylemleri içerir.
Drag Event- Bu, fare sürüklendiğinde meydana gelen bir giriş olayıdır. Adlı sınıf tarafından temsil edilirDragEvent. Girilen sürükle, bırakılan sürükle, girilen hedefi sürükleme, çıkılan hedefi sürükleme, üzerine sürükleme vb.
Window Event- Bu, eylemleri gösterme / gizleme ile ilgili bir olaydır. Adlı sınıf tarafından temsil edilirWindowEvent. Pencere gizleme, pencere gösterme, pencere gizleme, pencere gösterme vb. Eylemleri içerir.
Olay işleme
Olay İşleme, olayı kontrol eden ve bir olay meydana gelirse ne olacağına karar veren mekanizmadır. Bu mekanizma, bir olay gerçekleştiğinde yürütülen bir olay işleyicisi olarak bilinen koda sahiptir.
JavaFX, olayları işlemek için işleyiciler ve filtreler sağlar. JavaFX'te her olayda -
Target- Bir olayın meydana geldiği düğüm. Hedef bir pencere, sahne ve düğüm olabilir.
Source- Olayın oluşturulduğu kaynak, olayın kaynağı olacaktır. Yukarıdaki senaryoda, olayın kaynağı faredir.
Type- Meydana gelen olayın türü; fare olayı durumunda - fareye basılırsa, bırakılan fare olay türleridir.
Aşağıdaki gibi bir grup nesnesi kullanılarak eklenen Daire, Durdur ve Oynat Düğmeleri olan bir uygulamamız olduğunu varsayalım -
Oynat düğmesine tıklarsanız, kaynak fare, hedef düğüm oynat düğmesi ve üretilen olayın türü fare tıklaması olacaktır.
JavaFX'te Olay İşlemenin Aşamaları
Bir olay oluşturulduğunda, JavaFX aşağıdaki aşamalardan geçer.
Güzergah Yapımı
Bir olay oluşturulduğunda, olayın varsayılan / ilk rotası bir Event Dispatch chain. Sahneden kaynak Düğüme giden yoldur.
Yukarıdaki senaryoda oynat düğmesine tıkladığımızda oluşturulan olay için olay gönderme zinciri aşağıdadır.
Olay Yakalama Aşaması
Olay gönderme zincirinin oluşturulmasından sonra, uygulamanın kök düğümü olayı gönderir. Bu olay, gönderim zincirindeki tüm düğümlere (yukarıdan aşağıya) gider. Bu düğümlerden herhangi birinin birfilteroluşturulan olay için kayıtlıysa, yürütülecektir. Dağıtım zincirindeki düğümlerin hiçbirinde oluşturulan olay için filtre yoksa, hedef düğüme geçirilir ve son olarak hedef düğüm olayı işler.
Event Bubbling Aşaması
Olay köpürme aşamasında, olay hedef düğümden aşama düğümüne (aşağıdan yukarıya) hareket ettirilir. Olay gönderme zincirindeki düğümlerden herhangi birinde birhandleroluşturulan olay için kayıtlıysa, yürütülecektir. Bu düğümlerden hiçbirinin olayı işleyecek işleyicileri yoksa, olay kök düğüme ulaşır ve son olarak işlem tamamlanır.
Olay İşleyicileri ve Filtreleri
Olay filtreleri ve işleyiciler, bir olayı işlemek için uygulama mantığını içerenlerdir. Bir düğüm birden fazla işleyiciye / filtreye kaydolabilir. Üst-alt düğümler durumunda, tüm alt düğümler için varsayılan olarak işlenen üst öğelere ortak bir filtre / işleyici sağlayabilirsiniz.
Yukarıda belirtildiği gibi, olay sırasında işleme, yürütülen bir filtredir ve olay köpürme aşamasında bir işleyici çalıştırılır. Tüm işleyiciler ve filtreler arayüzü uygularEventHandler paketin javafx.event.
Olay Filtresi Ekleme ve Kaldırma
Bir düğüme olay filtresi eklemek için, yöntemi kullanarak bu filtreyi kaydetmeniz gerekir. addEventFilter() of Node sınıf.
//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);
Aynı şekilde, aşağıda gösterildiği gibi removeEventFilter () yöntemini kullanarak bir filtreyi kaldırabilirsiniz -
circle.removeEventFilter(MouseEvent.MOUSE_CLICKED, eventHandler);
Olay İşleme Örneği
Aşağıda, olay filtreleri kullanılarak JavaFX'te olay işlemeyi gösteren bir örnek verilmiştir. Bu kodu adıyla bir dosyaya kaydedinEventFiltersExample.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);
}
}
Kaydedilen java dosyasını aşağıdaki komutları kullanarak komut isteminden derleyin ve yürütün.
javac EventFiltersExample.java
java EventFiltersExample
Yürütüldüğünde, yukarıdaki program aşağıda gösterildiği gibi bir JavaFX penceresi oluşturur.
Olay İşleyicileri Ekleme ve Kaldırma
Bir düğüme olay işleyicisi eklemek için, yöntemi kullanarak bu işleyiciyi kaydetmeniz gerekir. addEventHandler() of Node aşağıda gösterildiği gibi sınıf.
//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);
Aynı şekilde, aşağıda gösterildiği gibi removeEventHandler () yöntemini kullanarak bir olay işleyicisini kaldırabilirsiniz -
circle.removeEventHandler(MouseEvent.MOUSE_CLICKED, eventHandler);
Misal
Aşağıdaki program, olay işleyicilerini kullanarak JavaFX'te olay işlemeyi gösteren bir örnektir.
Bu kodu adıyla bir dosyaya kaydedin 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);
}
}
Kaydedilen java dosyasını aşağıdaki komutları kullanarak komut isteminden derleyin ve yürütün.
javac EventHandlersExample.java
java EventHandlersExample
Yürütüldüğünde, yukarıdaki program, aşağıda gösterildiği gibi bir metin alanı ve bir 3B kutu görüntüleyen bir JavaFX penceresi oluşturur -
Burada, metin alanına bir harf yazarsanız, 3B kutu x ekseni boyunca dönmeye başlar. Kutuya tekrar tıklarsanız dönüş durur.
Olay İşleme için Kolaylık Yöntemlerini Kullanma
JavaFX'teki bazı sınıflar, olay işleyici özelliklerini tanımlar. Değerleri, ilgili ayarlayıcı yöntemlerini kullanarak bu özelliklere ayarlayarak, bir olay işleyicisine kaydolabilirsiniz. Bu yöntemler, kolaylık yöntemleri olarak bilinir.
Bu yöntemlerin çoğu Düğüm, Sahne, Pencere vb. Sınıflarda bulunur ve tüm alt sınıflarında mevcuttur.
Örneğin, bir düğmeye fare olay dinleyicisi eklemek için, kolaylık yöntemini kullanabilirsiniz. setOnMouseClicked() Aşağıda gösterildiği gibi.
playButton.setOnMouseClicked((new EventHandler<MouseEvent>() {
public void handle(MouseEvent event) {
System.out.println("Hello World");
pathTransition.play();
}
}));
Misal
Aşağıdaki program, kolaylık yöntemlerini kullanarak JavaFX'te olay işlemeyi gösteren bir örnektir.
Bu kodu adıyla bir dosyaya kaydedin 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);
}
}
Kaydedilen java dosyasını aşağıdaki komutları kullanarak komut isteminden derleyin ve yürütün.
javac ConvinienceMethodsExample.java
java ConvinienceMethodsExample
Yürütüldüğünde, yukarıdaki program aşağıda gösterildiği gibi bir JavaFX penceresi oluşturur. Animasyonu başlatmak için oynat düğmesine tıklayın ve animasyonu durdurmak için durdur düğmesine tıklayın.