Xử lý sự kiện trong Java Swing


Sự kiện (Event) là gì?

Đó là một sự thay đổi trong trạng thái của đối tượng, chẳng hạn như sự kiện miêu tả sự thay đổi trong trạng thái của source. Các sự kiện được tạo ra là do tương tác của người dùng với các thành phần UI. Ví dụ như việc nhấn vào một nút button, di chuyển chuột, nhập ký tự thông qua bàn phím, … Các sự kiện có thể được phân chia thành hai loại sau:

Foreground Event: Những sự kiện này yêu cầu tương tác trực tiếp của người dùng. Chúng được tạo ra do tương tác của người dùng với các thành phần đồ họa trong Graphical User Interface. Ví dụ như nhấn vào một nút, di chuyển chuật, chọn một item từ list, …

Background Event: Các sự kiện này yêu cầu tương tác của người dùng cuối cùng, ví dụ như tín hiệu ngắt hệ điều hành, hardware hoặc software failure …

Xử lý sự kiện (Event Handling) là gì?

Xử lý sự kiện (Event Handling) là một kỹ thuật kiểm soát sự kiện và quyết định những gì cần thực hiện nếu một sự kiện xảy ra. Kỹ thuật này có code, mà được biết như là Event Handler, được thực thi khi một sự kiện xảy ra. Java sử dụng Delegation Event Model để xử lý các sự kiện. Model này định nghĩa kỹ thuật chuẩn để tạo và xử lý các sự kiện. Model này bao gồm hai thành phần quan trọng sau:

Source: đây là một đối tượng mà trên đó sự kiện xuất hiện. Source chịu trách nhiệm cung cấp thông tin về sự kiện đã xảy ra tới bộ xử lý Handler của nó.

Listener: Còn được biết như là Event Handler. Listener chịu trách nhiệm tạo phản hồi tới một sự kiện. Theo quan điểm của Java, Listener cũng là một đối tượng. Listener đợi tới khi nó nhận một sự kiện. Khi một sự kiện đã được nhận, Listener xử lý sự kiện đó và sau đó trả về kết quả.

Lớp EventObject trong Java Swing

Đây là lớp gốc (root class) từ đó tất cả đối tượng về trạng thái sự kiện sẽ được kế thừa. Tất cả sự kiện được xây dựng với một tham chiếu tới đối tượng đó, là source. Lớp này được định nghĩa trong java.util package. Cú pháp khai báo của lớp java.util.EventObject như sau:

public class EventObject
   extends Object
      implements Serializable

Lớp EventObject có một trường là protected Object source. Đây là đối tượng mà trên đó sự kiện được xảy ra.

Lớp EventObject có một constructor là EventObject(Object source) dùng để xây dụng một nguyên mẫu sự kiện.

Các phương thức của lớp EventObject:

  • Object getSource(): Đối tượng mà trên đó sự kiện xảy ra.

  • String toString(): Trả về một biểu diễn chuỗi của EventObject này.

Lớp này kế thừa các phương thức từ lớp java.lang.Object.

Các lớp Event trong Java Swing

Ngoài lớp EventObject trên, phần dưới đây giới thiệu cho bạn một số Event Class được sử dụng phổ biến khác.

Lớp AWTEvent

Đây là lớp sự kiện gốc (root class) cho tất cả sự kiện AWTEvent. Lớp này và các lớp con của nó thay thế lớp ban đầu java.awt.Event. Lớp này được định nghĩa trong java.awt package. Lớp AWTEvent có phương thức getID() được sử dụng để xác định kiểu của sự kiện. Cú pháp khai báo của lớp java.awt.AWTEvent là:

public class AWTEvent
   extends EventObject

Lớp ActionEvent

Lớp ActionEvent được định nghĩa trong java.awt.event package. ActionEvent được tạo ra khi một nút được nhấn hoặc một item của một danh sách được nhấn đúp. Cú pháp khai báo cho lớp ActionEvent như sau:

public class ActionEvent
   extends AWTEvent

Lớp InputEvent

Lớp InputEvent là lớp sự kiện gốc (root class) cho tất cả sự kiện lien quan tới đầu vào (cấp độ thành phần). Các sự kiện liên quan tới đầu vào (input event) được phân phối bởi Listener trước khi chúng được xử lý một cách thông thường bởi source, nơi chúng sinh ra. Điều này cho phép các Listener và các lớp thành phần con có thể "consume" sự kiện để mà source sẽ không xử lý chúng theo phương thức mặc định. Cú pháp khai báo của lớp java.awt.event.InputEvent là:

public abstract class InputEvent
   extends ComponentEvent

Lớp KeyEvent

Sự kiện liên quan tới phím (Key Event) được tạo ra khi bạn nhập ký tự. Có ba kiểu key event, mà được biểu diễn bởi các hằng nguyên, chúng là:

  • KEY_PRESSED

  • KEY_RELASED

  • KEY_TYPED

Cú pháp khai báo của lớp java.awt.evetn.KeyEvent như sau:

public class KeyEvent
   extends InputEvent

Lớp MouseEvent

Sự kiện này chỉ một hoạt động liên quan tới chuột xảy ra trong một thành phần. Sự kiện tầm thấp này được tạo bởi một đối tượng Component cho các sự kiện liên quan tới chuột và di chuyển chuột, chẳng hạn như một nút chuột được nhấn, được nhả ra, được click (nhấn và nhả ra), di chuyển chuột, kéo chuột, …

Cú pháp khai báo cho lớp java.awt.event.MouseEvent:

public class MouseEvent
   extends InputEvent

Lớp WindowEvent

Đối tượng của lớp này biểu diễn thay đổi về trạng thái của một cửa sổ. Sự kiện tầm thấp này được tạo bởi một đối tượng Window khi nó được mở, đóng, kích hoạt, … hoặc khi trọng tâm focus được chuyển vào trong hoặc ngoài Window. Cú pháp khai báo của lớp java.awt.event.WindowEvent là:

public class WindowEvent
   extends ComponentEvent

Lớp AdjustmentEvent

Lớp AdjustmentEvent biểu diễn các sự kiện liên quan tới sự căn chỉnh được tạo bởi các đối tượng có thể căn chỉnh (Adjustable object). Cú pháp khai báo của lớp java.awt.event.AdjustmentEvent là như sau:

public class AdjustmentEvent
   extends AWTEvent

Lớp ComponentEvent

Lớp ComponentEvent biểu diễn rằng một thành phần bị di chuyển, thay đổi kích cỡ, hoặc thay đổi tính nhìn thấy. Cú pháp khai báo của lớp java.awt.event.ComponentEvent là:

public class ComponentEvent
   extends AWTEvent

Lớp ContainerEvent

Lớp ContainerEvent biểu thị rằng các nội dung của một container đã thay đổi bởi vì một thành phần đã được thêm vào hoặc bị gỡ bỏ. Cú pháp khai báo của lớp java.awt.event.ContainerEvent là:

public class ContainerEvent
   extends ComponentEvent

Lớp MouseMotionEvent

Lớp MouseMotionEvent chỉ một hành động liên quan tới chuột (mouse action) đã xảy ra trong một thành phần. Sự kiện tầm thấp này được tạo bởi một đối tượng Component khi chuột bị kéo hoặc di chuyển. Cú pháp khai báo cho lớp java.awt.event.MouseMotionEvent là:

public class MouseMotionEvent
   extends InputEvent

Lớp PaintEvent

Lớp PaintEvent được sử dụng để bảo đảm rằng các lời gọi phương thức paint/update được xếp thứ tự theo các sự kiện khác được phân phối từ hàng sự kiện (event queue). Cú pháp khai báo cho lớp java.awt.event.PaintEvent là:

public class PaintEvent
   extends ComponentEvent