JavaFX - इवेंट हैंडलिंग

JavaFX में, हम GUI एप्लिकेशन, वेब एप्लिकेशन और ग्राफिकल एप्लिकेशन विकसित कर सकते हैं। ऐसे अनुप्रयोगों में, जब भी कोई उपयोगकर्ता एप्लिकेशन (नोड्स) के साथ बातचीत करता है, तो एक घटना होती है।

उदाहरण के लिए, एक बटन पर क्लिक करना, माउस को स्थानांतरित करना, कीबोर्ड के माध्यम से एक चरित्र में प्रवेश करना, सूची से एक आइटम का चयन करना, पृष्ठ को स्क्रॉल करना ऐसी गतिविधियां हैं जो एक घटना का कारण बनती हैं।

घटनाक्रम के प्रकार

घटनाओं को मोटे तौर पर निम्नलिखित दो श्रेणियों में वर्गीकृत किया जा सकता है -

  • Foreground Events- उन घटनाओं को जो एक उपयोगकर्ता के सीधे संपर्क की आवश्यकता होती है। वे ग्राफ़िकल यूज़र इंटरफ़ेस में ग्राफ़िकल घटकों के साथ बातचीत करने वाले व्यक्ति के परिणामों के रूप में उत्पन्न होते हैं। उदाहरण के लिए, एक बटन पर क्लिक करना, माउस को हिलाना, कीबोर्ड के माध्यम से एक चरित्र में प्रवेश करना, सूची से एक आइटम का चयन करना, पृष्ठ को स्क्रॉल करना आदि।

  • Background Events- जिन घटनाओं को अंतिम उपयोगकर्ता की सहभागिता की आवश्यकता होती है, उन्हें पृष्ठभूमि की घटनाओं के रूप में जाना जाता है। ऑपरेटिंग सिस्टम में रुकावट, हार्डवेयर या सॉफ्टवेयर की विफलता, टाइमर की समाप्ति, ऑपरेशन पूरा होना पृष्ठभूमि की घटनाओं का उदाहरण है।

JavaFX में घटनाएँ

JavaFX घटनाओं की एक विस्तृत विविधता को संभालने के लिए सहायता प्रदान करता है। नाम का वर्गEvent पैकेज का javafx.event एक घटना के लिए आधार वर्ग है।

इसके किसी भी उपवर्ग का एक उदाहरण एक घटना है। JavaFX कई प्रकार के ईवेंट प्रदान करता है। उनमें से कुछ नीचे सूचीबद्ध हैं।

  • Mouse Event- यह एक इनपुट ईवेंट है जो माउस क्लिक करने पर होता है। यह नाम के वर्ग द्वारा दर्शाया गया हैMouseEvent। इसमें माउस क्लिक, माउस प्रेस, माउस रिलीज़, माउस मूव, माउस एंटर टार्गेट, माउस एक्साइटेड टारगेट आदि जैसी क्रियाएं शामिल हैं।

  • Key Event- यह एक इनपुट ईवेंट है जो नोड पर होने वाले कुंजी स्ट्रोक को इंगित करता है। यह नाम के वर्ग द्वारा दर्शाया गया हैKeyEvent। इस ईवेंट में मुख्य दबाए गए, जारी किए गए और टाइप किए गए कुंजी जैसे कार्य शामिल हैं।

  • Drag Event- यह एक इनपुट ईवेंट है जो माउस को घसीटने पर होता है। यह नाम के वर्ग द्वारा दर्शाया गया हैDragEvent। इसमें ड्रैग एंटर, ड्रैग ड्रॉप, ड्रैग एन्टर्ड टारगेट, ड्रैग एग्जिट टारगेट, ड्रैग ओवर, इत्यादि जैसी क्रियाएं शामिल हैं।

  • Window Event- यह विंडो से संबंधित एक घटना है जो कार्रवाई दिखा रही है। यह नाम के वर्ग द्वारा दर्शाया गया हैWindowEvent। इसमें विंडो छिपाना, विंडो दिखाया जाना, विंडो छिपाना, विंडो दिखाना आदि क्रियाएं शामिल हैं।

घटना से निपटना

ईवेंट हैंडलिंग वह तंत्र है जो ईवेंट को नियंत्रित करता है और यह तय करता है कि यदि कोई घटना होती है तो क्या होना चाहिए। इस तंत्र में एक कोड होता है जिसे एक इवेंट हैंडलर के रूप में जाना जाता है जिसे किसी घटना के होने पर निष्पादित किया जाता है।

JavaFX घटनाओं को संभालने के लिए हैंडलर और फिल्टर प्रदान करता है। JavaFX में हर इवेंट में -

  • Target- जिस नोड पर एक घटना हुई। एक लक्ष्य एक खिड़की, दृश्य और एक नोड हो सकता है।

  • Source- जिस स्रोत से घटना उत्पन्न होती है वह घटना का स्रोत होगा। उपरोक्त परिदृश्य में, माउस घटना का स्रोत है।

  • Type- हुई घटना का प्रकार; माउस घटना के मामले में - माउस दबाया गया, जारी किए गए माउस इवेंट के प्रकार हैं।

मान लें कि हमारे पास एक एप्लिकेशन है जिसमें एक समूह ऑब्जेक्ट का उपयोग करके एक सर्कल, स्टॉप और प्ले बटन डाला गया है -

यदि आप प्ले बटन पर क्लिक करते हैं, तो स्रोत माउस होगा, लक्ष्य नोड प्ले बटन होगा और उत्पन्न घटना माउस क्लिक है।

जावाएफएक्स में इवेंट हैंडलिंग के चरण

जब भी कोई घटना उत्पन्न होती है, तो JavaFX निम्नलिखित चरणों से गुजरता है।

मार्ग निर्माण

जब भी कोई ईवेंट उत्पन्न होता है, तो ईवेंट का डिफ़ॉल्ट / प्रारंभिक मार्ग निर्माण द्वारा निर्धारित किया जाता है Event Dispatch chain। यह मंच से स्रोत नोड तक का मार्ग है।

जब हम उपर्युक्त परिदृश्य में प्ले बटन पर क्लिक करते हैं, तो ईवेंट के लिए ईवेंट प्रेषण श्रृंखला होती है।

इवेंट कैप्चरिंग चरण

ईवेंट प्रेषण श्रृंखला के निर्माण के बाद, एप्लिकेशन का रूट नोड ईवेंट भेजता है। यह घटना प्रेषण श्रृंखला में सभी नोड्स (ऊपर से नीचे) तक जाती है। अगर इनमें से कोई भी नोड हैfilterउत्पन्न घटना के लिए पंजीकृत, यह निष्पादित किया जाएगा। यदि प्रेषण श्रृंखला में किसी भी नोड के पास उत्पन्न होने वाली घटना के लिए कोई फ़िल्टर नहीं है, तो इसे लक्ष्य नोड में पास किया जाता है और अंत में लक्ष्य नोड घटना को संसाधित करता है।

घटना बबलिंग चरण

ईवेंट बबलिंग चरण में, ईवेंट को लक्ष्य नोड से स्टेज नोड (नीचे से ऊपर) तक यात्रा की जाती है। यदि घटना प्रेषण श्रृंखला में कोई भी नोड हैhandlerउत्पन्न घटना के लिए पंजीकृत, यह निष्पादित किया जाएगा। यदि इन नोड्स में से किसी में भी ईवेंट को संभालने के लिए हैंडलर नहीं हैं, तो ईवेंट रूट नोड तक पहुंच जाता है और अंत में प्रक्रिया पूरी हो जाएगी।

इवेंट हैंडलर और फिल्टर

इवेंट फ़िल्टर और हैंडलर वे होते हैं जिनमें किसी इवेंट को प्रोसेस करने के लिए एप्लिकेशन लॉजिक होता है। एक नोड एक से अधिक हैंडलर / फ़िल्टर पर पंजीकरण कर सकता है। माता-पिता-बच्चे के नोड्स के मामले में, आप माता-पिता को एक सामान्य फ़िल्टर / हैंडलर प्रदान कर सकते हैं, जिसे सभी बच्चे नोड्स के लिए डिफ़ॉल्ट रूप से संसाधित किया जाता है।

जैसा कि ऊपर उल्लेख किया गया है, घटना के दौरान, प्रसंस्करण एक फ़िल्टर होता है जिसे निष्पादित किया जाता है और इवेंट बबलिंग चरण के दौरान, एक हैंडलर निष्पादित होता है। सभी हैंडलर और फिल्टर इंटरफ़ेस को लागू करते हैंEventHandler पैकेज का javafx.event

ईवेंट फ़िल्टर जोड़ना और निकालना

नोड में ईवेंट फ़िल्टर जोड़ने के लिए, आपको विधि का उपयोग करके इस फ़िल्टर को पंजीकृत करना होगा addEventFilter() का Node कक्षा।

//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);

उसी तरह, आप विधि removeEventFilter () का उपयोग करके एक फ़िल्टर हटा सकते हैं जैसा कि नीचे दिखाया गया है -

circle.removeEventFilter(MouseEvent.MOUSE_CLICKED, eventHandler);

इवेंट हैंडलिंग उदाहरण

निम्नलिखित एक उदाहरण है जो इवेंट फ़िल्टर का उपयोग करके JavaFX में ईवेंट हैंडलिंग को प्रदर्शित करता है। इस कोड को नाम वाली फ़ाइल में सहेजेंEventFiltersExample.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); 
   } 
}

निम्न कमांड का उपयोग करके कमांड प्रॉम्प्ट से सहेजे गए जावा फ़ाइल को संकलित और निष्पादित करें।

javac EventFiltersExample.java 
java EventFiltersExample

निष्पादित करने पर, उपरोक्त कार्यक्रम एक JavaFX विंडो बनाता है जैसा कि नीचे दिखाया गया है।

ईवेंट हैंडलर्स जोड़ना और निकालना

किसी नोड में ईवेंट हैंडलर जोड़ने के लिए, आपको विधि का उपयोग करके इस हैंडलर को पंजीकृत करना होगा addEventHandler() का Node नीचे दिखाया गया है।

//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);

उसी तरह, आप एक ईवेंट हैंडलर को हटा सकते हैं विधि को हटाने का उपयोग करकेइवेंटहैंडलर () नीचे दिखाया गया है -

circle.removeEventHandler(MouseEvent.MOUSE_CLICKED, eventHandler);

उदाहरण

निम्न कार्यक्रम एक उदाहरण है जो घटना हैंडलर्स का उपयोग करके JavaFX में ईवेंट हैंडलिंग को प्रदर्शित करता है।

इस कोड को नाम वाली फ़ाइल में सहेजें 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); 
   } 
}

निम्न कमांड का उपयोग करके कमांड प्रॉम्प्ट से सहेजे गए जावा फ़ाइल को संकलित और निष्पादित करें।

javac EventHandlersExample.java 
java EventHandlersExample

निष्पादित करने पर, उपरोक्त कार्यक्रम एक जावा फ़ील्ड बनाता है जिसमें एक पाठ क्षेत्र और नीचे दिखाए गए अनुसार 3 डी बॉक्स प्रदर्शित होता है -

यहां, यदि आप टेक्स्ट फ़ील्ड में एक अक्षर लिखते हैं, तो 3 डी बॉक्स एक्स अक्ष के साथ घूमना शुरू कर देता है। यदि आप बॉक्स पर फिर से क्लिक करते हैं तो रोटेशन बंद हो जाता है।

इवेंट हैंडलिंग के लिए सुविधा विधियों का उपयोग करना

JavaFX की कुछ कक्षाएं इवेंट हैंडलर प्रॉपर्टीज़ को परिभाषित करती हैं। अपने संबंधित सेटर विधियों का उपयोग करके इन गुणों के मूल्यों को निर्धारित करके, आप एक इवेंट हैंडलर में पंजीकरण कर सकते हैं। इन विधियों को सुविधा विधियों के रूप में जाना जाता है।

इन विधियों में से अधिकांश नोड, दृश्य, विंडो, आदि जैसी कक्षाओं में मौजूद हैं, और वे अपने सभी उप वर्गों के लिए उपलब्ध हैं।

उदाहरण के लिए, एक बटन में माउस ईवेंट श्रोता को जोड़ने के लिए, आप सुविधा विधि का उपयोग कर सकते हैं setOnMouseClicked() जैसा की नीचे दिखाया गया।

playButton.setOnMouseClicked((new EventHandler<MouseEvent>() { 
   public void handle(MouseEvent event) { 
      System.out.println("Hello World"); 
      pathTransition.play(); 
   } 
}));

उदाहरण

निम्न प्रोग्राम एक उदाहरण है जो सुविधा के तरीकों का उपयोग करके JavaFX में ईवेंट हैंडलिंग को प्रदर्शित करता है।

इस कोड को नाम वाली फ़ाइल में सहेजें 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); 
   } 
}

निम्न कमांड का उपयोग करके कमांड प्रॉम्प्ट से सहेजे गए जावा फ़ाइल को संकलित और निष्पादित करें।

javac ConvinienceMethodsExample.java 
java ConvinienceMethodsExample

निष्पादित करने पर, उपरोक्त कार्यक्रम एक JavaFX विंडो बनाता है जैसा कि नीचे दिखाया गया है। यहां एनीमेशन शुरू करने के लिए प्ले बटन पर क्लिक करें और एनीमेशन को रोकने के लिए स्टॉप बटन पर क्लिक करें।