Hướng dẫn sử dụng Swing trong Java với Actions

MỤC LỤC

Phân tích một chương trình Swing

Một vài tính nằng thú vị sẽ không được đề cập đến trong bài học này như icons, actions, công nghệ Pluggable Look & Feel, assistive technologies, và separate models. Assistive technologies such as screen readers can use the Accessibility API to get information from Swing components. Because support for the Accessibility API is built into the Swing components, your Swing program will probably work just fine with assistive technologies, even if you do nothing special.

With very little extra effort, however, you can make your program function even more smoothly with assistive technologies, which might well expand its market.

Cách sử dụng Actions

Bảng sau đây liệt kê những phương thức và contructors thường dùng các Action. Thông qua phương thức setEnabled(false), vô hiệu tất cả các tác động lên các thành phần. (in JToolBar) Tạo một đối tượng Jbutton và đặt chúng lên thanh công cụ.

Cách sử dụng Icons

Phương thức getSystemResource sẽ dò tìm trong thư mục và tập tin JAR trong đường dẫn của chương trình, trả về URL ngay khi nó tìm thấy. Bảng sau đây liệt kê những cấu trúc và phương thức sử dụng thông thường của ImageIcon. Lưu ý là ImageIcon không có nguồn gốc từ JComponent hay thậm chí là từ Component.

Vẽ ảnh của icon trong vùng đồ hoạ đã được chỉ địnhPaint the image icon's image in the specified graphics context. You would do this only if you're implementing a custom component that performs its own painting. You can rely on the default behavior provided by Component class and pass in any component.

Sử dụng tiến trình(Threads)

Nếu tạo một thread, cần phải tránh những nguy hiểm khi thực thi một tiến trình với các lớp tiện ích như SwingWorker hay Timer.

Sử dụng Timers

Bảng sau đây liệt kê những cấu trúc và phương thức của Timer. Tham số thứ hai là một action listener, là một constructor dùng để nhận biết với một timer.

Sử dụng Layout Managers

Theo sau là một vài đoạn lệnh tiêu biểu trong một Container có sử dụng GridBagLayout. GridBagLayout rút ra một giá trị ràng buộc và không dùng lại GridBagConstraints. Sử dụng GridBagConstraints.REMAINDER để xác định thành phần đang ở hàng cuối cùng hay cột cuối cùng.

Sau đây là một Applet chỉ cho thấy GridBagLayout hoạt động như thế nào. Quản lý bố trí phải thực thi LayoutManager interface, nơi chỉ định năm phương thức phải được định nghĩa. Việc quản lý cách bố trí có thể thực thi LayoutManager2, là một giao diện con của LayoutManager.

Gọi khi Container hiển thị lần đầuis first displayed, và mọi lúc nó tahy đổi kích thước.

Tổng quan về Writing Event Listeners

Nhưng quan trọng hơn hết là các phương thức event-listener sẽ được xử lý một cách nhanh chóng. Lấy thông tin sự kiện: Event Objects (Getting Event Information: Event Objects) Mỗi một phương thức event-listener đều có một đối số đơn, một đối tượng thừa kế từ lớp EventObject. Lớp Event đôi khi cũng định nghĩa một phương thức giống như getSource, nhưng kiểu của giá trị.

Ví dụ như lớp ComponentEvent định nghĩa phương thức getComponent, giống như getSource, trả về đối tượng nắm bắt sự kiện. Các sự kiện có thể được phân chia thành 2 loại: low-level events và semantic events. Low-level events mô tả window-system xảy ra hoặc dữ liệu vào ở mức thấp (low-level input).

Những sự kiện low-level khác bao gồm component, container, focus, và window events. Hành động của mỗi semantic event có thể khác nhau do thành phần. Hầu hết các giao diện AWT listener, không như ActionListener, chứa nhiều hoặc một phương thức.

Ví dụ, giao diện MouseListener chứa năm phương thức: mousePressed, mouseReleased, mouseEntered, mouseExited, và mouseClicked. Để giúp bạn tránh được các lộn xộn với những phương thức rỗng trong chương trình, AWT cung cấp lớp adapter class cho mỗi listener interface với nhiều hơn một phương thức. Giải pháp là định nghĩa một lớp inner -- một lớp nằm trong Aplet -- that extends the MouseAdapter class,.

Hỗ trợ Listeners của các thành phần Swing

Bảng sau đây liệt kê các thành phần Swing và listeners được hỗ trơ.

Thực hiện Listeners cho các Handled Events thông thường

Mỗi một phương thức của sự kiện các thành phần có một thông số đơn: đối tượng ComponentEvent lớp ComponentEvent định nghĩa một phương thức hay dùng, getComponent, trả về thành phần mà phát ra sự kiện. Những sự kiện của Container được phát ra ngay sau khi một thành phần được thêm vào Container hoặc chuyển đi khỏi Container. Mỗi phương thức của Container Event có một thông số đơn: đối tượng ContainerEvent.

Trả về thành phần được thêm hay chuyển khỏi Container trong sự kiện này. Mọi thông báo thông thường mà bạn gởi tới đối tượng FocusEvent là getComponent (được định nghĩa trong ComponentEvent), nó trả về thành phần gây ra sự kiện này. Mỗi phương thức của Item event có một thông số đơn: đối tượng ItemEvent.

Thay vào đó, phương thức Mouse Motion Event sử dụng đối tượng MouseEvent. Lớp WindowEvent định nghĩa một phương thức, getWindow, trả về Window phát ra sự kiện này.

Thực hiện hoạt cảnh (Performing Animation)

Tạo chuyển động cho một hình ảnh trên màn hình (Moving an Image Across the Screen). Trong thế giới của hoạt cảnh truyền thống, điều này được gọi là cutout animation. Cải tiến giao diện và thực hiện hoạt cảnh (Improving the Appearance and Performance of Image Animation).

MediaTracker còn có thể giảm thiểu lượng thời gian để nạp hình ảnh. Sử dụng MediaTracker để nạp và nạp hình ảnh (Using MediaTracker to Download Images and Delay Image Display). Để kiểm tra trạng thái của việc nạp dữ liệu về, ta dùng phương thức MediaTracker statusID hoặc statusAll.

Chương trình MTImageSequenceTimer.java là một ví dụ về việc sử dụng phương thức MediaTracker waitForAll và checkAll.

Chuyển đổi như thế nào?

//import java.awt.Button; //temporarily remove this import import java.awt.Color; //it's OK to leave this in, since //Color isn't a component. Ta không cần tham chiếu đến lớp Applet vì Swing applet đã trở thành một lớp con của lớp JApplet của Swing. Nếu chương trình đang sử dụng AppletContext, AppletStub, hoặc AudioClip thì cần phải giữ lại những lớp này trong gói java.applet.

//import java.applet.*; //temporarily remove this import import java.applet.AppletContext; //add this if necessary Bước 4: Import the gói Swing. Trước khi tiếp tục, cần lưu ý rằng: Although AWT is thread-safe, Swing is not. Hầu hết các chương trình đều định nghĩa các thành phần trong các phương thức event-handling và painting, là nhưng phương thức được gọi từ tiến trình event- dispatching.

Một vài thành phần Swing có mã nguồn không tương thích với thành phần AWT tương ứng. Chương trình sử dụng các thành phần AWT, ta có thể thêm trực tiếp các thành phần AWT vào trong frames, dialogs, và applets. Chú ý rằng layout manager mặc định của một content pane là BorderLayout chứ không phải FlowLayout được sử dụng trong Applet.

Với các thành phần Swing, việc thực hiện painting trong mã lênh được thể hiện trong phương thức paintComponent. Thực hiện giống như đã mô tả trong phần biên dịch và chạy chương trình Swing.