SWING - การจัดการเหตุการณ์

ในบทนี้คุณจะได้เรียนรู้เกี่ยวกับเหตุการณ์ประเภทของเหตุการณ์และเรียนรู้วิธีจัดการกับเหตุการณ์ ตัวอย่างมีไว้ท้ายบทเพื่อความเข้าใจที่ดีขึ้น

เหตุการณ์คืออะไร?

การเปลี่ยนแปลงสถานะของวัตถุเรียกว่า Eventกล่าวคือเหตุการณ์อธิบายถึงการเปลี่ยนแปลงสถานะของแหล่งที่มา เหตุการณ์ถูกสร้างขึ้นจากการโต้ตอบของผู้ใช้กับคอมโพเนนต์ส่วนติดต่อผู้ใช้แบบกราฟิก ตัวอย่างเช่นการคลิกปุ่มเลื่อนเมาส์ป้อนอักขระผ่านแป้นพิมพ์เลือกรายการจากรายการและการเลื่อนหน้าเป็นกิจกรรมที่ทำให้เกิดเหตุการณ์

ประเภทของเหตุการณ์

เหตุการณ์สามารถแบ่งออกเป็นสองประเภทอย่างกว้าง ๆ -

  • Foreground Events- เหตุการณ์เหล่านี้ต้องการการโต้ตอบโดยตรงของผู้ใช้ สิ่งเหล่านี้สร้างขึ้นจากผลที่ตามมาของบุคคลที่โต้ตอบกับส่วนประกอบกราฟิกในอินเทอร์เฟซผู้ใช้แบบกราฟิก ตัวอย่างเช่นคลิกที่ปุ่มเลื่อนเมาส์ป้อนอักขระผ่านแป้นพิมพ์เลือกรายการจากรายการเลื่อนหน้าเป็นต้น

  • Background Events- เหตุการณ์เหล่านี้ต้องการการโต้ตอบของผู้ใช้ปลายทาง การขัดจังหวะของระบบปฏิบัติการความล้มเหลวของฮาร์ดแวร์หรือซอฟต์แวร์การหมดอายุของตัวจับเวลาและการดำเนินการเสร็จสิ้นเป็นตัวอย่างของเหตุการณ์เบื้องหลัง

Event Handling คืออะไร?

การจัดการเหตุการณ์เป็นกลไกที่ควบคุมเหตุการณ์และตัดสินใจว่าจะเกิดอะไรขึ้นหากเหตุการณ์เกิดขึ้น กลไกนี้มีรหัสซึ่งเรียกว่าตัวจัดการเหตุการณ์ซึ่งจะดำเนินการเมื่อมีเหตุการณ์เกิดขึ้น

Java ใช้ Delegation Event Model เพื่อจัดการกับเหตุการณ์ โมเดลนี้กำหนดกลไกมาตรฐานในการสร้างและจัดการกับเหตุการณ์

Delegation Event Model มีผู้เข้าร่วมหลักดังต่อไปนี้

  • Source- แหล่งที่มาคือวัตถุที่เหตุการณ์เกิดขึ้น แหล่งที่มามีหน้าที่ในการให้ข้อมูลของเหตุการณ์ที่เกิดขึ้นแก่ผู้ดูแล Java จัดเตรียมคลาสสำหรับอ็อบเจ็กต์ต้นทางให้เรา

  • Listener- เรียกอีกอย่างว่าตัวจัดการเหตุการณ์ ผู้ฟังมีหน้าที่ในการตอบสนองต่อเหตุการณ์ จากมุมมองของการใช้งาน Java ผู้ฟังยังเป็นวัตถุ ผู้ฟังรอจนกว่าจะได้รับเหตุการณ์ เมื่อได้รับเหตุการณ์แล้วผู้ฟังจะประมวลผลเหตุการณ์แล้วส่งกลับ

ประโยชน์ของแนวทางนี้คือตรรกะของอินเทอร์เฟซผู้ใช้จะแยกออกจากตรรกะที่สร้างเหตุการณ์โดยสิ้นเชิง องค์ประกอบอินเทอร์เฟซผู้ใช้สามารถมอบหมายการประมวลผลเหตุการณ์ให้กับโค้ดแยกต่างหาก

ในรุ่นนี้ผู้ฟังจำเป็นต้องลงทะเบียนกับวัตถุต้นทางเพื่อให้ผู้ฟังสามารถรับการแจ้งเตือนเหตุการณ์ได้ นี่เป็นวิธีที่มีประสิทธิภาพในการจัดการกิจกรรมเนื่องจากการแจ้งเตือนกิจกรรมจะถูกส่งไปยังผู้ฟังที่ต้องการรับเท่านั้น

ขั้นตอนที่เกี่ยวข้องกับการจัดการเหตุการณ์

Step 1 - ผู้ใช้คลิกปุ่มและเหตุการณ์จะถูกสร้างขึ้น

Step 2 - อ็อบเจ็กต์ของคลาสเหตุการณ์ที่เกี่ยวข้องถูกสร้างขึ้นโดยอัตโนมัติและข้อมูลเกี่ยวกับซอร์สและเหตุการณ์จะถูกเติมในอ็อบเจ็กต์เดียวกัน

Step 3 - วัตถุเหตุการณ์ถูกส่งต่อไปยังเมธอดของคลาส Listener ที่ลงทะเบียนแล้ว

Step 4 - เมธอดถูกดำเนินการและส่งคืน

สิ่งที่ต้องจำเกี่ยวกับผู้ฟัง

  • ในการออกแบบคลาสผู้ฟังคุณต้องพัฒนาอินเทอร์เฟซสำหรับผู้ฟังบางส่วน อินเทอร์เฟซ Listener เหล่านี้คาดการณ์วิธีการเรียกกลับที่เป็นนามธรรมสาธารณะบางอย่างซึ่งต้องนำไปใช้โดยคลาส Listener

  • หากคุณไม่ใช้อินเทอร์เฟซใด ๆ ที่กำหนดไว้ล่วงหน้าคลาสของคุณจะไม่สามารถทำหน้าที่เป็นคลาสตัวฟังสำหรับอ็อบเจ็กต์ต้นทาง

วิธีการโทรกลับ

นี่คือวิธีการที่ผู้ให้บริการ API จัดเตรียมไว้และกำหนดโดยโปรแกรมเมอร์แอปพลิเคชันและเรียกใช้โดยนักพัฒนาแอปพลิเคชัน วิธีการโทรกลับแสดงวิธีเหตุการณ์ ในการตอบสนองต่อเหตุการณ์ java jre จะเรียกใช้วิธีการโทรกลับ วิธีการโทรกลับทั้งหมดดังกล่าวมีให้ในอินเตอร์เฟส Listener

หากส่วนประกอบต้องการให้ผู้ฟังบางคนฟังเหตุการณ์ของมันแหล่งที่มาจะต้องลงทะเบียนตัวเองกับผู้ฟัง

ตัวอย่างการจัดการเหตุการณ์

สร้างโปรแกรม Java ต่อไปนี้โดยใช้โปรแกรมแก้ไขที่คุณเลือกในการพูด D:/ > SWING > com > tutorialspoint > gui >

SwingControlDemo.java

package com.tutorialspoint.gui;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SwingControlDemo {
   private JFrame mainFrame;
   private JLabel headerLabel;
   private JLabel statusLabel;
   private JPanel controlPanel;

   public SwingControlDemo(){
      prepareGUI();
   }
   public static void main(String[] args){
      SwingControlDemo swingControlDemo = new SwingControlDemo();  
      swingControlDemo.showEventDemo();       
   }
   private void prepareGUI(){
      mainFrame = new JFrame("Java SWING Examples");
      mainFrame.setSize(400,400);
      mainFrame.setLayout(new GridLayout(3, 1));

      headerLabel = new JLabel("",JLabel.CENTER );
      statusLabel = new JLabel("",JLabel.CENTER);        
      statusLabel.setSize(350,100);
      
      mainFrame.addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent windowEvent){
            System.exit(0);
         }        
      });    
      controlPanel = new JPanel();
      controlPanel.setLayout(new FlowLayout());

      mainFrame.add(headerLabel);
      mainFrame.add(controlPanel);
      mainFrame.add(statusLabel);
      mainFrame.setVisible(true);  
   }
   private void showEventDemo(){
      headerLabel.setText("Control in action: Button"); 

      JButton okButton = new JButton("OK");
      JButton submitButton = new JButton("Submit");
      JButton cancelButton = new JButton("Cancel");

      okButton.setActionCommand("OK");
      submitButton.setActionCommand("Submit");
      cancelButton.setActionCommand("Cancel");

      okButton.addActionListener(new ButtonClickListener()); 
      submitButton.addActionListener(new ButtonClickListener()); 
      cancelButton.addActionListener(new ButtonClickListener()); 

      controlPanel.add(okButton);
      controlPanel.add(submitButton);
      controlPanel.add(cancelButton);       

      mainFrame.setVisible(true);  
   }
   private class ButtonClickListener implements ActionListener{
      public void actionPerformed(ActionEvent e) {
         String command = e.getActionCommand();  
         
         if( command.equals( "OK" ))  {
            statusLabel.setText("Ok Button clicked.");
         } else if( command.equals( "Submit" ) )  {
            statusLabel.setText("Submit Button clicked."); 
         } else {
            statusLabel.setText("Cancel Button clicked.");
         }  	
      }		
   }
}

คอมไพล์โปรแกรมโดยใช้พรอมต์คำสั่ง ไปที่D:/ > SWING และพิมพ์คำสั่งต่อไปนี้

D:\AWT>javac com\tutorialspoint\gui\SwingControlDemo.java

หากไม่มีข้อผิดพลาดเกิดขึ้นแสดงว่าการคอมไพล์สำเร็จแล้ว รันโปรแกรมโดยใช้คำสั่งต่อไปนี้

D:\AWT>java com.tutorialspoint.gui.SwingControlDemo

ตรวจสอบผลลัพธ์ต่อไปนี้