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.