Swing được mô tả như là một tập các thành phần đồ họa được tạo ra để những cảm quan (Look&Feel) được thể hiện vào thời điểm runtime
Thật sự, thì Swing còn nhiều hơn như thế. Swing là bộ công cụ GUI thế hệ kế tiếp mà Sun Microsystems tạo ra cho phép môi trường phát triển enterprise trong Java.Bằng môi trường phát triển enterprise, chúng ta hiểu rằng, các lập trình viên có thể sử dụng Swing để tạo ra các ứng dụng Java có khả năng mở rộng với một dãy nhiều thành phần mạnh mẽ. Thêm vào đó, bạn có thể kế thừa hoặc chỉnh sửa những thành phần này để điều khiển việc hiển thị và các hành xử của chúng.
14 trang |
Chia sẻ: ngtr9097 | Lượt xem: 4313 | Lượt tải: 4
Bạn đang xem nội dung tài liệu Đề tài Tìm hiểu gói javax.swing và bài toán ứng dụng, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Tổng quan về Swing
Khái niệm về Swing
Nếu bạn đã từng vào trang chủ của Java ( bạn sẽ nhìn thấy Swing được mô tả như là một tập các thành phần đồ họa được tạo ra để những cảm quan (Look&Feel) được thể hiện vào thời điểm runtime. Thật sự, thì Swing còn nhiều hơn như thế. Swing là bộ công cụ GUI thế hệ kế tiếp mà Sun Microsystems tạo ra cho phép môi trường phát triển enterprise trong Java.Bằng môi trường phát triển enterprise, chúng ta hiểu rằng, các lập trình viên có thể sử dụng Swing để tạo ra các ứng dụng Java có khả năng mở rộng với một dãy nhiều thành phần mạnh mẽ. Thêm vào đó, bạn có thể kế thừa hoặc chỉnh sửa những thành phần này để điều khiển việc hiển thị và các hành xử của chúng. Swing không phải là một từ viết tắt. Đó là tên thay thế cho một tập hợp lựa chọn của nó cho các designer khi dự án được thực hiện vào 1996. Swing thật sự là một phần của gia đình rộng lớn các sản phẩm của Java được biết đến như Java Foundation Classes s(JFC) bao gồm nhiều đặc điểm của Internet Foundation Classes của Netscape cũng như bị ảnh hưởng thiết kế của Taligent và Lighthouse Design của IBM. Swing được phát triển thật sự kể từ thời điểm bản beta của JDK 1.1, khoảng mùa xuân 1997. Swing API bản beta đưa ra khoảng nửa cuối 1997 và được chính thức phát hành vào tháng 3 năm 1998. Khi được phát hành, các thư viện của Swing 1.0 chứa khoảng 250 lớp và 80 giao tiếp. Sự phát triển được tiếp tục khi theo thời gian, bản Swing 1.4 chứa 85 giao tiếp public và 451 lớp public. Mặc dù Swing là được phát triển đơn lẻ từ lõi của Java Development Kit, nó yêu cầu phải có tối thiểu JDK 1.1.5 để chạy. Swing được xây dựng dựa trên những mô hình event được giới thiệu trong serie JDK 1.1. Bạn không thể sử dụng Swing với JDK 1.0.2, thêm vào đó bạn phải có Java 1.1 cho phép trình duyệt hỗ trợ Swing Applet. Java 2 SDK 1.4 được phát hành bao gồm nhiều lớp Swing được cập nhật và hỗ trợ một vài đặc điểm mới. Swing được tích hợp đầy đủ trong cả trong bộ công cụ của các nhà phát triển và runtime environment của tất cả các bản phát hành Java 2 (SDK 1.2 và những phiên bản cao hơn) chứa cả Java Plug-in.
Đặc điểm của Swing
2.1 Cảm quan Pluggable
Một trong những tính thể hiện thú vị nhất ở các lớp Swing là khả năng viết những cảm quan (Look&Feels) cho mỗi thành phần, thậm chí thay đổi cảm quan vào thời điểm runtime. L&Fs trở thành một vấn đề quan trọng trong việc phát triển GUI qua 10 năm. Nhiều người dùng quen thuộc với kiểu giao diện Motif phổ biến trong Windows 3.1 và vẫn còn sử dụng rộng rãi trong platform Unix. Microsoft tạo ra L&F nhỏ gọn hơn trong các hệ điều hành 95/98/NT/2000 của họ. Ngoài ra, hệ thống máy tính Macintosh cũng có một L&F được thiết kế riêng mà hầu hết người dùng Apple đều cảm thấy thoải mái với chúng.Swing có khả năng thể hiện nhiều L&F khác nhau và hiện tại hỗ trợ các L&F bao gồm Windows, Unix Motif và Java Metal là L&F mặc định. Thêm vào đó, Swing cho phép người dùng chuyển đổi L&F vào thời điểm runtime mà không phải đóng ứng dụng. Theo cách này, một người dùng sẽ thử xem cảm quan nào là thể hiện tốt nhất đối với họ. Và nếu bạn cảm thấy bạn thật sự có tham vọng là một nhà phát triển, bạn hãy tạo L&F cho riêng bạn đối với mỗi thành phần Swing.
2.2 Các thành phần LightWeight
Hầu hết các thành phần Swing đều không nặng nề. Theo nghĩa đen, nghĩa là những thành phần này độc lập trên những L&F hiển thị chúng. Thay vào đó, chúng sử dụng môi trường đồ họa gốc đơn giản để vẽ chúng trên màn hình. Khả năng tạo ra những thành phần lightweight lần đầu tiên được đề cập trong JDK 1.1, mặc dù những thành phần AWT chính lại không nhận được những đặc điểm tiện lợi của nó. Trước đó, các lập trình viên không có một sự lựa chọn nào nhưng có những lớp con java.awt.Canvas hoặc java.awt.Panel để những lập trình viên có thể tạo ra những thành phần của riêng họ. Từ 2 lớp này, Java xác định một đối tượng opaque từ hệ điều hành đang chạy để thay thế thành phần này, tác động mạnh đến mỗi thành phần để tương tác nếu như bản thân nó là cửa sổ, và vì thế sẽ được đặt trên hình chữ nhật, đường viền đơn (solid). Vì thế những thành phần này mang tên gọi “heavyweight” bởi vì chúng nắm giữ những phần mở rộng ở mức độ gốc mà Java không sử dụng. Với các thành phần lightweight, mỗi thành phần thể hiện bản thân nó bằng cách sử dụng đồ họa gốc của đối tượng Graphics. Chúng luôn thể hiện bản thân chúng trên bề mặt của các thành phần heavyweight cao nhất mà chúng được chứa trong đó. Những lớp này cho phép các lập trình viên thể hiện một cách nhanh chóng ngữ cảnh đồ họa của khung chứa (container). Kết quả là những thành phần tiết kiệm được vùng nhớ, chạy nhanh hơn những gì có sẵn trước đó trong Java.Hầu hết các thành phần Swing là lightweight, chỉ có một vài container top-level là không phải. Thiết kế này cho phép các lập trình viên vẽ và vẽ lại L&F của ứng dụng của họ vào thời điểm runtime kết hợp chúng vào cảm quan của hệ điều hành chạy ứng dụng đó. Thêm vào đó, cách thiết kế các thành phần Swing cho phép hỗ trợ dễ dàng chỉnh sửa cách hành xử của các thành phần.
2.3 Các đặc điểm mở rộng
Những đặc điểm riêng khác phân biệt Swing với những thành phần AWT cũSwing có rất nhiều những thành phần mới như table, tree, slider, spinner, progress bar, internal frame và text. Những thành phần Swing hỗ trợ việc thay thế các inset của chúng bằng một số lượng tùy ý các border lồng bên trong.Các thành phần Swing có các Tooltip đặt bên trên chúng. Bạn có thể tùy chọn các sự kiện bàn phím cho các thành phần, định nghĩa chúng hoạt động như thế nào với những phím nóng đã cho.- Ngoài ra còn có hỗ trợ debug cho việc hiển thị những thành phần Swing
2.4 Các gói và các lớp Swing
Dưới đây là những mô tả ngắn về các gói trong thư viện Swing1.javax.accessibilityChứa các lớp và các giao tiếp mà có thể được sử dụng cho phép công nghệ trợ giúp để tương tác với các thành phần của Swing. Các công nghệ trợ giúp đề cập một dãy các item, từ bộ đọc văn bản đến phóng đại màn hình. Mặc dù các lớp accessibility là những công nghệ không thuộc các thành phần Swing nhưng chúng được sử dụng mở rộng thông qua các thành phần Swing.2.javax.swingChứa các thành phần cốt lõi của Swing, bao gốm hầu hết các mô hình giao tiếp và các lớp hỗ trợ3.javax.swing.borderChứa định nghĩa các lớp đường viền trừu tượng cũng như 8 đường viền được định nghĩa. Border không phải là những thành phần, thay vì thế, chúng là những yếu tố đồ họa đặc biệt mà Swing sử dụng như những thuộc tính và đặt chúng xung quanh các thành phần. Nếu như bạn muốn tạo ra border của riêng bạn, bạn có thể tạo lớp con từ những border có sẵn trong gói này, hoặc bạn có thể viết mã cho một lớpmới.4.javax.swing.colorchooserHỗ trợ cho thành phần JColorChooser5.javax.swing.eventĐịnh nghĩa những listener mới và những event mà những thành phần Swing sử dụng để giao tiếp thông tin với các class.6.javax.swing.filechooserHỗ trợ cho thành phần JFileChooser7.javax.swing.plafĐịnh nghĩa những yếu tố duy nhất tạo nên L&F cho mỗi thành phần Swing. Trong gói này chứa các gói con là javax.swing.plaf.basic, javax.swing.plaf.metal và javax.swing.plaf.multi8.javax.swing.tableCung cấp các mô hình và quan sát cho thành phần table, cho phép bạn sắp xếp thông riêng biệt trong định dạng lưới với sự xuất hiện tương tự như bảng tính.9.javax.swing.textCung cấp các điểm của các lớp và giao tiếp dựa trên văn bản hỗ trợ thiết kế thông dụng được biết đến như document/view.10.javax.swing.text.htmlSử dụng kỹ thuật đọc và định dang văn bản HTML11.javax.swing.text.html.parserHỗ trợ việc phân tích HTML12.javax.swing.text.rtfSử dụng kỹ thuật đọc và định dạng Rich Text Format13.javax.swing.treeĐịnh nghĩa các mô hình và quan sát thành phần một cây phân cấp , có thể thay thế một cấu trúc file hoặc một dãy các thuộc tính.14.javax.swing.undoChứa những chức năng cần thiết cho việc bổ sung chức năng undo.
Các khái niệm và chức năng của Swing
Các thành phần Swing và sự phân cấp giới hạn
Swing cung cấp rất nhiều thành phần GUI chuẩn như: buttons, lists, menus, và text areas, là những thành phần mà bạn sẽ phối hợp để tạo nên GUI cho chương trình của bạn. Ngoài ra, còn có các đối tượng chứa như windows và tool bars.
SwingApplication tạo 4 thành phần Swing thường dùng như sau:
một frame, hoặc một cửa sổ làm việc chính (JFrame)
một panel, thông thường gọi là pane (JPanel)
một button (JButton)
một label (JLabel)
frame là đối tượng chứa ở mức đỉnh. is a top-level container. Sự hiện diện của frame nhằm cung cấp một vùng để các thành phần khác thiết lập sự có mặt của mình trên vùng đó. Ngoài ra còn có các thành phần khác thường được sử dụng để làm đối tượng chứa mức đỉnh là dialogs (JDialog) và applets (JApplet).
panel là đối tượng chứa mức trung gian (intermediate container). panel nhằm mục đích xác định vị trí của button và label. Những đối tượng chứa mức trung gian khác còn có scroll panes (JScrollPane) và tabbed panes (JTabbedPane), chúng có ảnh hưởng lẫn nhau, tương tác với nhau rtong giao diện của một chương trình.
button và label là những thành phần cơ bản (atomic components), những thành phần mà không thể chứa các thành phần Swing khác AWT thông thường, các thành phần cơ bản này sẽ là nơi để nhận thông tin đầu vào từ phía người dùng. Swing API cung cấp nhiều thành phần cơ bản, bao gồm combo boxes (JComboBox), text fields (JTextField), và tables (JTable).
Hình dưới đây là sơ đồ phân cấp giới hạn của các thành phần SwingApplication.
Như hình vẽ trên, ngay cả các chương trình Swing đơn giảnn nhất cũng có nhiều mức khác nhau. Nhưng bao giờ gốc của sơ đồ vẫn là đối tượng chứa mức đỉnh, nới để các thành phần Swing khác thể hiện sự tồn tại của mình.
Mỗi một đối tượng chứa mức đỉnh đều gián tiếp chứa một đối tượng chứa trung gian thường được gọi là content pane. Khi làm việc, bạn không cần quan tâm thế nào là đối tượng chứa mức đỉnh và cái nào là đối tượng chứa trung gian. Chương trình sẽ tự động quản lý cho bạn.
pane contains, trực tiếp hoặc gián tiếp chứa tất cả các thành phần sẽ hiển thị trong GUI. Riêng đối với top-level container thì có menu bar, menu bar sẽ đứng trong một vùng đặc biệt nằm ngoài content pane.
Để thêm một thành phần vào đối tượng chứa, có thể dùng nhiều cách khác nhau của phương thức add(). Phương thức add() có ít nhất 1 đối số (argument)
Đoạn mã sau đây sẽ thực hiện việc thêm một button và một label vào trong panel:
frame = new JFrame(...);
button = new JButton(...);
label = new JLabel(...);
pane = new JPanel();
pane.add(button);
pane.add(label);
frame.getContentPane().add(pane, BorderLayout.CENTER);
Layout Management
Các đối tượng chứa sử dụng layout managers để xác lập kích thước và vị trí của các thành phần chứa trong nó. Borders sẽ ảnh hưởng đến layout của Swing GUIs bằng cách làm cho các thành phần lớn lên.
Layout management là quá trình xác định kích thước và vị trí của các thành phần. Mặc định, mỗi đối tượng chứa sẽ có một layout manager.
Java platform hỗ trợ sử dụng 5 layout managers thông thường nhất: BorderLayout, BoxLayout, FlowLayout, GridBagLayout, và GridLayout. Những layout managers được thiết kế để hiển thị đa thành phần trong cùng một thời điểm. Và lớp thứ 6, CardLayout, là một trường hợp đặc biệt. Nó được sử dụng để kết hợp các layout managers với nhau.
Bạn có thể dể dàng thay đổi một layout managers trở thành một container để sử dụng. Đơn giản là chỉ cần gọi phương thức setLayout. Đoạn mã sau đây sử dụng BorderLayout:
JPanel pane = new JPanel();
pane.setLayout(new BorderLayout());
Ta có thể sử dụng các phương thức sau để tùy biến kích thước và vị trí của các thành phần: setMinimumSize, setPreferredSize, và setMaximumSize, hoặc có thể xây dựng các lớp con của các thành phần để khai thác các phương thức như: getMinimumSize, getPreferredSize, và getMaximumSize.
Bên cạnh việc cung cấp các tùy biến về kích thước, ta cũng còn có thể cung cấp thêm các tùy biến về việc canh chỉnh, gồm các phương thức sau: setAlignmentX và setAlignmentY, getAlignmentX và getAlignmentY methods.
Event Handling
Event handling thể hiện việc chương trình phản hồi các yêu cầu từ phía bên ngoài, ví dụ như việc người dùng nhấn phím chuột. Chương trình Swing sẽ thực hiện tất cả các thao tác và nắm bắt các sự kiện (event handling) bằng cách thực hiện tiến trình của sự kiện.
Mỗi khi người dùng nhấn phím hay kích chuột, thì một sự kiện xảy ra. Bất kể đối tượng nào cùng đều được gán bởi một sự kiện. Các thành phần Swing có thể tạo ra nhiều kiểu sự kiện khác nhau. Bảng sau đây liệt kê một vài kiểu sự kiện:
Hành động
Kiểu Listener
User kích vào nút lệnh, nhấn phím Spacebar khi đang làm việc trong text field, hoặc kích chọn vào menu item
ActionListener
User đóng một frame (main window)
WindowListener
User nhấn một nút chuột trong khi đang rê chuột trên một thành phần
MouseListener
User di chuyển chuột trên một thành phần
MouseMotionListener
Thành phần hiển thị
ComponentListener
Thành phần lấy trạng thái của keyboard
FocusListener
Việc chọn lựa trong Table hoặc list có thay đổi
ListSelectionListener
Mỗi sự kiện đều được đại diện bởi một đối tượng và đối tượng đó cung cấp thông tin về sự kiện cũng như nhận dạng được nơi phat ra sự kiện. Nguồn của sự kiện thông thường là các thành phần, nhưng những kiểu đối tượng khác cũng có thể là nguồn của sự kiện. Hình sau đây minh hoạ cho vấn đề này.
Mỗi event handler đòi hỏi có 3 bước như sau:
Trong phần khai báo cho lớp event handler, xác định rõ mỗi lớp sẽ thực thi một listener interface hoặc kế thừa một lớp mà lớp đó thực thi một listener interface. Ví dụ:
public class MyClass implements ActionListener {
Đăng ký sự hiện diện của lớp event handler như là một listener trên một hoặc nhiều thành phần. Ví dụ:
someComponent.addActionListener(instanceOfMyClass);
Thực thi những phương thức trong listener interface. Ví dụ:
public void actionPerformed(ActionEvent e) {
...//code that reacts to the action...
}
Hãy xem xét cách thức một nút lệnh (JButton) nắm bắt sự kiện kích chuột. Để xác định khi nào thì người dùng kích chuột lên nút lệnh (hoặc dùng các phím nóng) thì một chương trình phải có đối tượng thực thi giao diện ActionListener. Chương trình phải đăng ký đối tượng đó như là một action listener trên nút lệnh (nguồn của sự kiện) bằng cách sử dụng phương thức addActionListener. Khi user kích lên nút lệnh, nút lệnh sẽ phát ra một hành vi của sự kiện. Đây là yêu cầu của phương thức actionPerformed. Trong phương thức này, tham số sẽ là một đối tượng ActionEvent và tham số này sẽ cung cấp thông tin về sự kiện và nguồn của sự kiện.
Khi user vào nút lệnh, action listeners của nút lệnh được phát ra.
Painting
Painting nghĩa là vẽ các thành phần trên màn hình. Mặc dầu việc tùy chọn các thành phần được thực hiện một cách dễ dàng, nhưng hầu hết các chương trình đều bị làm phức tạp lên bằng cách tùy chọn đường viền cho các thành phần.
Khi một Swing GUI cần vẽ lại giao diện của chính nó, hoặc khi cần làm tươi những điều chỉnh về trạng thái của chương trình, nó sẽ khởi động thành phần ở mức cao nhất (top-level component) cần được vẽ lại và làm việc dần xuống theo luồng phân cấp. Quá trình xữ lý này được thực hiện bởi hệ thống AWT nhàmư làm cho chương trình có vẽ hiệu quả và thích ứng hơn.
Các thành phần Swing có thể vẽ lại chính nó bất kể khi nào cần thiết. Khi gọi phương thức setText trên một thành phần, thành phần đó sẽ tự động vẽ lại chính nó, thay đổi kích thước,…
Cũng giống như event-handling, painting cũng được thực hiện trong một tiến trình đơn. Trong khi một sự kiện đang xảy ra thì quá trình vẽ lại không được thực hiện.
Quá trình vẽ lại các thành phần sẽ không bị ngắt quảng bởi các sự kiện khác.
Actions
Với đối tượng Action, Swing API cung cấp những hỗ trợ đặc biệt cho việc chia xẽ dữ liệu và trạng thái giữa hai hoặc nhiều thành phần phát ra các sự kiện hành động. Ví dụ, khi ta có một button và một menu item cùng một chức năng, lúc đos cần cân nhắc việc sử dụng đối tượng Action để xác định văn bản, icon và trạng thái của hai thành phần.
Sau đây là ví dụ của việc sử dụng Action để tạo ra một button trên thanh công cụ và một menu item cùng thực hiện một chức năng:
Action leftAction = new (...);
JButton button = toolBar.add(leftAction);
JMenuItem menuItem = mainMenu.add(leftAction);
Đối với button hay menu item, để có được những hữu ích thực sự của việc sử dụng Action, ta phải tạo thành phần sử dụng phương thức add(Action) của JToolBar, JMenu, hoặc JPopupMenu. Mặc định, không có hàm API nào tồn tại ở bên trên addActionListener(ActionListener) để kết nối một Action với một thành phần khác đang tồn tại thực sự.
Để tạo một đối tượng Action, nói chung là ta phải tạo một lớp con của lớp AbstractAction và thực thi nó. trong lớp con này, ta cho thực hiện phương thức actionPerformed để tác động ngược trở lại một cách thoả đáng khi hành vi sự kiện xảy ra. Sau đây là ví dụ của việc tạo và thực hiện lớp con của lớp AbstractAction:
leftAction = new AbstractAction("Go left",
new ImageIcon("images/left.gif")) {
public void actionPerformed(ActionEvent e) {
displayResult("Action for first button/menu item", e);
}
};
Hình dưới đây là demo ứng dụng của việc sử dụng Action để thực hiện ba tính năng.
Đây là những gì nhìn thấy khi menu "Go left" trở nên disabled:
Đoạn mã của "Go left" action:
boolean selected = ...//true if the action should be enabled;
//false, otherwise
leftAction.setEnabled(selected);
Sau khi tạo ra thành phần sử dụng Action, ta có thể tùy biến chúng theo ý thích của mình. Ví dụ như khi muốn thêm vào dòng tooltip của một button, hoặc tùy biến việc xuất hiện hay biến mất của cá thành phần bằng cách thêm vào , xoá đi các icon, dòng văn bản:
button = toolBar.add(leftAction);
button.setText(""); //an icon-only button
button.setToolTipText("This is the left button");
menuItem = mainMenu.add(leftAction);
menuItem.setIcon(null); //arbitrarily chose not to use icon in menu
Bảng sau đây liệt kê những phương thức và contructors thường dùng các Action. Các hàm API sử dụng đối tượng Action được chia thành hai loại như sau:
Tạo và sử dụng một Action
Tạo một thành phần điều khiển Action (Action-Controlled Component)
Creating and Using an Action
Constructor or Method
Purpose
AbstractAction() AbstractAction(String) AbstractAction(String, Icon)
Tạo một đối tượng Action. Thông qua các tham số của phương thức hay Contructors,có thể xác lập văn bản hay icon trong thành phần ấy.
void setEnabled(boolean) boolean isEnabled()
Xác lập hay nhận biết cá thành phần có nhận được tác động hay không. 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. Tương tự như vậy, sử dụng phương thức setEnabled(true) để tác động lại hành vi của các thành phần.
Creating an Action-Controlled Component
Method
Purpose
JMenuItem add(A