Giao trinh Java
Phõn VI: To ra mt GUI vi JFC/Swing
TOM TT
Trong phõn nay se hng dõn ban cach tao ra nhng giao diờn ngi dung ụ hoa
(GUIs) vi JFC/Swing cho nhng ng dung va applets thụng qua viờc s dung
nhng thanh phõn Swing. Nhng thanh phõn Swing, mụt bụ phõn cua Java
TM
Foundation Classes (JFC), co thờ c s dung hoc vi JDK
TM
1.1 hoc Java
TM
2
platform.
Ghi chu: phõn nay khụng hng dõn ban cach s dung nhng thanh phõn
AWT
1. Nhp mụn vi Swing
Trong phần này sẽ lớt qua nhanh và nhằm mục đích là cho bạn hình dung về JFC
và Swing. Sau đó sẽ là cách để biên dịch và chạy chơng trình - cho cả ứng dụng
và các applets thông qua việc sử dụng các thành phần Swing bằng một chơng trình
đơn giản.
2. Cac khai niờm va chc nng cua Swing
Cung cõp cac thụng tin cõn thiờt ờ s dung cac thanh phõn Swing mụt cach co hiờu
qua. Vi du nh cach mụt chng trinh Swing hiờn thi giao diờn ụ hoa ngi dung,
cach quan ly cac s kiờn nh kich chuụt va cuụi cung se la viờc s dung cac khai
niờm va chc nng nh thờ nao trong mụt chng trinh thc s.
3. S dung cac thanh phõn Swing
Hng dõn cach s dung mụi thanh phõn Swing button, table, cac thanh phõn
text(nhin chung cac thanh phõn Swing cung tng t nh cac thanh phõn AWT.
Tuy nhiờn, chung co mụt sụ tinh nng mi. Vi du nh button, label co thờ nap hinh
anh,...)
4. S dung cac chc nng khac cua Swing.
Với mỗi phiên bản sử dụng, tùy thuộc vào việc chúng ta cần đến JDK 1.1 hay là Java 2
Platform và không cần phải thêm bất kỳ thư viện nào mà vẫn có thể sử dụng được
Swing API. Tuy nhiên, nếu cần sử dụng JDK 1.1 thì thêm vào Swing API (sử dụng JFC
1.1)
Hãng Sun đã phát hành nhiều phiên bản của JFC 1.1 và để nhận biết nó là phiên bản nào
thì cần dựa vào phiên bản của Swing API chứa trong nó.
Bảng sau đây liệt kê các thông tin về Swing API.
Swing API
Version
Tương ứng với
phiên bản
JFC 1.1
Tương ứng với
phiên bản
Java 2 Platform
(Standard Edition)
Chú thích
Swing 1.0.3
JFC 1.1
(with
Swing 1.0.3)
Không
Phiên bản của JFC 1.1 bao gồm Java Plug-
in
TM
1.1.1.
Swing 1.1
JFC 1.1
(with Swing 1.1)
v 1.2, v 1.2.1
javax.swing.plaf.basic, javax.swing.plaf.metal, javax.swing.plaf.multi,
javax.swing.table, javax.swing.text, javax.swing.text.html, javax.swing.tree, and
javax.swing.undo.
Trong hầu hết các chương trình chỉ sử dụng một phần nhỏ của API, chủ yếu là các gói
Swing javax.swing, javax.swing.event.
Sự khác biêt giữa các thành phần Swing và AWT
Các thành phần AWT được cung cấp trong JDK 1.0 và 1.1. Mặc dù Java 2 Platform vẫn
còn hỗ trợ các thành phần AWT, tuy nhiên, chúng ta nên dùng các thành phần Swing.
Khi sử dụng, có thể phân biệt các thành phần Swing với các thành phần AWT. Các
thành phần Swing có tên bắt đầu bằng ký tự J. Ví dụ như, lớp AWT button class có tên
là Button thì lớp Swing button có tên là Jbutton. Ngoài ra, các thành phần AWT thì nằm
trong gói java.awt, còn các thành phần Swing thì nằm trong gói javax.swing. Do đó, khi
sử dụng các thành phần Swing thì trong phần khai báo của chương trình, ta nhớ thêm
vào dòng lệnh sau:
import javax.swing.*;
Sự khác biệt lớn nhất giữa các thành phần AWT và Swing đấy là các thành phần Swing
được thực thi mà hoàn toàn không cần mã nguồn (with absolutely no native code). Kể
từ khi các thành phần Swing không còn bị hạn chế trong những khuôn mẫu thông
thường, (the least common denominator), tức là lúc mà các tính năng của nó đã có mặt
hầu hết trong các phiên bản, thì các chức năng của nó đã mở rộng hơn nhiều so với các
chức năng của các thành phần AWT. Do các thành phần Swing không có mã nguồn
(native code), nên chúng có thể được thêm vào như là một add-on của JDK 1.1 hay như
một phần của Java 2 Platform.
Ngay cả những thành phần Swing đơn giản nhất cũng đã có những khả năng vượt xa
các thành phần AWT:
• Swing buttons và labels có thể hiển thị hình ảnh và cả văn bản.
• Có thể dễ dàng thay đổi đường viền của hầu hết các thành phần Swing. Ta
có thể dễ dàng thay đổi đường viền của một label hay một đối tượng chứa nào
đó.
• Có thể dễ dàng thay đổi hành vi hay giao diện của một thành phần Swing
//import com.sun.java.swing.*; //Used by JDK 1.2 Beta 4 and all
//Swing releases before Swing 1.1 Beta 3.
import java.awt.*;
import java.awt.event.*;
public class SwingApplication {
private static String labelPrefix = "Number of button clicks: ";
private int numClicks = 0;
dxn1345262233.doc 4
Giáo trình Java
public Component createComponents() {
final JLabel label = new JLabel(labelPrefix + "0 ");
JButton button = new JButton("I'm a Swing button!");
button.setMnemonic(KeyEvent.VK_I);
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
numClicks++;
label.setText(labelPrefix + numClicks);
}
});
label.setLabelFor(button);
/*
* An easy way to put space between a top-level container
* and its contents is to put the contents in a JPanel
* that has an "empty" border.
*/
JPanel pane = new JPanel();
pane.setBorder(BorderFactory.createEmptyBorder(
30, //top
30, //left
10, //bottom
SDKs khi các gói Swing được tích hợp trong phiên bản Standard Edition của Java 2
Platform. Câu lệnh như sau:
javac -deprecation SwingApplication.java
Trường hợp khi biên dịch không thành công, có thể là do bạn đang sử dụng trình biên
dịch JDK 1.1 thay vì v 1.2 hoặc v 1.3 hoặc đang sử dụng bản beta của Java 2 Platform.
Thực thi chương trình sẽ được thực hiện khi đã biên dịch thành công. Cần đảm bảo là
trong class path đã chỉ đường dẫn đến file thực thi:
Vd: java -classpath .;C:\java\lnfdir\newlnf.jar SwingApplication
Lưu ý: không cần phải gỏ phần đuôi mở rộng .cls. trình thông dịch của phiên bản 1.2
hay 1.3 sẽ tự động dò tìm.
2.2 Biên dịch và thực thi chương trình với JDK 1.1
Cũng tương tự như với Java 2 Platform, nhưng trình biên dịch sử dụng ở đây là JDK 1.1
và JFC 1.1.
3. Thực thi các Swing Applets
Để viết một Swing Applets, trước tiên là phải thực thi được chúng. Phần này sẽ giới
thiệu 2 applets.
Sau đây là phần mã của applets HelloSwingApplet.java
import javax.swing.*; //This is the final package name.
//import com.sun.java.swing.*; //Used by JDK 1.2 Beta 4 and all
//Swing releases before Swing 1.1 Beta 3.
import java.awt.*;
public class HelloSwingApplet extends JApplet {
// This is a hack to avoid an ugly error message in 1.1.
public HelloSwingApplet() {
getRootPane().putClientProperty("defeatSystemEventQueueCheck",
Boolean.TRUE);
}
public void init() {
JLabel label = new JLabel(
"You are successfully running a Swing applet!");
import java.awt.*;
import java.awt.event.*;
4.2Choosing the look and feel
dxn1345262233.doc 7
Giáo trình Java
Swing cho phép bạn chỉ định rõ “look and feel” mà chương trình của bạn sử
dụng -- Java look and feel, Windows look and feel, CDE/Motif look and feel, ...
Đoạn mã in đậm dưới đây sẽ chỉ ra cho bạn cách mà SwingApplication chỉ định
“look and feel”:
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(
UIManager.getCrossPlatformLookAndFeelClassName());
} catch (Exception e) { }
...//Create and show the GUI...
}
4.3 Xác lập đối tượng chứa mức đỉnh
Mỗi chương trình được trình diễn đều có giao diện với mức đơn giản nhất là
một đối tượng chứa thuộc thành phần của Swing ở mức đỉnh. Ở hầu hết các ứng
dụng, đối tượng chứa Swing ở mức đỉnh có thể là JFrame, JDialog, hoặc (cho
applets) JApplet. Mỗi đối tượng JFrame sẽ thực hiện một cửa sổ chính và mỗi
JDialog sẽ thực thi cho cửa sổ thứ hai. Mỗi đối tượng JApplet thực hiện việc
hiển thị của một applet bên trong một cửa sổ. Các đối tượng chứa mức đỉnh của
Swing cung cấp các hổ trợ cần thiết để các thành phần Swing thực hiện việc vẽ
và quản lý các hành vi.
Ví dụ SwingApplication chỉ có đối tượng chứa mức đỉnh là JFrame. Khi người
sử dụng đóng frame thi ứng dụng sẽ thoát. Đoạn mã sau đây xác lập và cho hiển
thị frame:
public class SwingApplication {
...
...
label.setLabelFor(button);
...//in the event handler for button clicks:
label.setText(labelPrefix + numClicks);
Đoạn mã trên đơn giản, ngoại trừ dòng khởi động phương thức setLabelFor().
Nó xuất hiện ở đây giống như sự gợi ý về kỷ thuật hổ trợ trực tiếp (assistive
technologies) mà thông qua đó, một label được mô tả như là một button.
4.5Thêm thành phần vào các đối tượng chứa.
SwingApplication nhóm label và button vào trong một đối tượng chứa (JPanel)
trước khi thêm vào frame một thành phần khác. Đoạn mã sau đây khởi tạo một
panel:
(1) JPanel pane = new JPanel();
(2) pane.setBorder(BorderFactory.createEmptyBorder(30, 30, 10, 30));
(3) pane.setLayout(new GridLayout(0, 1));
(4) pane.add(button);
(5) pane.add(label);
Dòng (1) dùng để tạo một panel, khai báo một đối tượng có kiểu Jpanel với tên
gọi là pane.
Dòng (2) để tạo đường viền bao bọc cho panel đó.
Dòng (3) dùng đẻ tạo một đối tượng quản lý layout để giám sát tất cả các thành
phần có trong panel sẽ được hiển thị trên một cột.
Dòng (4) và (5) dùng để đưa button và label vào trong panel. Việc thêm button
và label vào trong panel có nghĩa là chúng sẽ được điều khiển bởi layout quản lý
panel đó.
4.6 Thêm đường viền (borders) xung quanh một thành phần.
Đoạn mã sau đây sẽ tạo một đường viền cho một panel:
pane.setBorder(BorderFactory.createEmptyBorder(
30, //top
30, //left
10, //bottom
cách thức để xử lý thông tin trên GUI. Hỗ trợ này đã có trong hầu hết các thành
phần Swing. Trong SwingApplication có một chỗ đề cập đến kỹ thuật này:
label.setLabelFor(button);
Như đã nói, việc lấy thông tin từ các thành phần Swing là điều đang được quan
tâm, kỹ thuật trên đã giúp cho công việc này được thực hiện một cách dễ dàng:
JButton button = new JButton("I'm a Swing button!");
label = new JLabel(labelPrefix + "0 ");
label.setText(labelPrefix + numClicks);
JFrame frame = new JFrame("SwingApplication");
dxn1345262233.doc 10
Giáo trình Java
Bài 2: Các khái niệm và chức năng của Swing
Trong bài này sẽ giới thiệu các đặc trưng của Swing và giảng giải các khái niệm
cần thiết để bạn có thể nắm bắt và sử dụng các thành phần Swing một cách có
hiệu quả. Phần cuối của bài học này sẽ phân tích một chương trình Swing và đây
sẽ là phần tổng kết lại những gì bạn đã học trong bài này.
1. 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.
Trong phần này , chúng ta sẽ tiếp tục xem xét thông qua ví dụ SwingApplication
đã được mô tả trong phần A Quick Tour of a Swing Application's.
Ví dụ này sẽ đề cập đến một vài thành phần Swing thường dùng và cách thức
chúng tương tác với nhau trong một GUI và của sự phân cấp giới hạn.
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
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);
2. 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.
Hình dưới đây hiển thị GUI của 5 chương trình. GUI của chúng khác nhau là do
sử dụng các layout managers khác nhau để xác định kích thước và vị trí của
buttons.
dxn1345262233.doc 12
Giáo trình Java
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.
Xác lập Layout Manager
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:
size of the content pane's border, if any. Next, the grid layout manager
queries each component in the content pane for its preferred size, noting
the largest preferred width and largest preferred height. Then it calculates
the content pane's preferred size.
4. When each button is asked for its preferred size, the button first
checks whether the user specified a preferred size. If so, it reports that
size. If not, it queries its look and feel for the preferred size.
3. 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
MouseMotionListe
ner
Thành phần hiển thị
ComponentListene
r
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.
Caption: Khi user vào nút lệnh, action listeners của nút lệnh được
phát ra.
Tiến trình và Event Handling (Threads and Event Handling)
Mã của event-handling xảy ra trong một tiến trình đơn hay còn gọi là event-
dispatching thread. Điều này nhằm đảm bảo là mỗi event handler hoàn thành
việc thực hiện trước khi một event handler xảy ra. Ở ví dụ minh hoạ trên,
phương thức actionPerformed được xữ lỹ trong một tiến trình đơn.
4. Painting
dxn1345262233.doc 15
Giáo trình Java
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.
Cách làm việc của Painting (How Painting Works)
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,…
(if any)
5. Threads and Swing
Nếu làm việc các thành phần mà những thành phần đó phụ thuộc hoặc ảnh
hưởng đến trạng thái của nó, ta cần phải thực hiện chúng trong một tiến trình
đơn. Tuy nhiên, những chương trình khác cần sử dụng phương thức invokeLater
để thực hiện việc gọi cá thành phần có liên quan trong tiến trình ấy.
Nếu một chương trình tạo ra và chỉ làm việc trên GUI của chính nó, thì không
cần quan tâm về tiến trình. Ví dụ, chương trình là một applet, nó sẽ đảm bảo an
toàn khi lưu cấu trúc của nó trong phương thức init. Thậm chí, khi chương trình
là một ứng dụng như dưới đây, thì vẫn đảm bảo được sự an toàn nói trên:
//Thread-safe example
public class MyApplication {
public static void main(String[] args) {
JFrame f = new JFrame(...);
...//Add components to the frame here...
f.pack();
f.setVisible(true);
//Don't do any more GUI work here.
}
...
//All manipulation of the GUI -- setText, getText, etc. --
//is performed in event handlers such as actionPerformed().
...
}
6. Những tính năng và khái niệm khác của Swing
dxn1345262233.doc 17
Giáo trình Java
Swing cung cấp nhiều tính năng. Rất nhiều tính năng được cung cấp bởi
JComponent class. 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
DecimalField.java, FollowerRangeModel.java,FormattedDocument.java và
Unit.java.
Sau đây là hình ảnh minh hoạ về giao diện của Converter:
dxn1345262233.doc 18
Giáo trình Java
Trong các bài học sau, chúng ta sẽ tìm hiểu chi tiết về các tính năng, khái niệm về
Swing. Chắc chắn sẽ còn nhiều thú vị đang chờ đợi chúng ta
dxn1345262233.doc 19
Giáo trình Java
Bài 3: Sử dụng các tính năng khác của Swing
Bài học này hướng dẫn cách sử dụng các tính năng khác của Swing.
1. Cách sử dụng Actions
Với đối tượng Action, ta có thể sắp xếp và quản lý các trạng thái của hai hoặc
nhiều thành phần tạo ra sự kiện của hành vi. Ví dụ, bạn có thể sử dụng Action để
tạo ra và quản lý một button trên thanh công cụ, một menu biểu tượng cùng thực
hiện một chức năng.
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 <a class that implements Action>(...);
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
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(Action) Tạo một đối tượng JMenuItem và đặt chúng vào
dxn1345262233.doc 21
Giáo trình Java
JMenuItem insert(Action,
int)
(in JMenu and
JPopupMenu)
trong menu hay popup menu.
JButton add(Action)
(in JToolBar)
Tham số thứ nhất trong ImageIcon constructor xác định tập tin ảnh để nạp lên,
phần này phải đẻ ý đến đường dẫn tới thư mục có chứa tập tin class. Tham số
thứ hai dùng để mô tả về icon ấy, giống như phần tooltip của các ứng dụng mà
chúng ta vẫn thường thấy.
Nói chung, các applet nạp hính ảnh từ máy tính, nơi phục vụ cho applet ấy. Có
hai lý do để làm như vậy, thứ nhất là không tin tưởng khi để các applet đọc các
tập tin hệ thông từ máy nó đang chạy. Thứ hai là để kết hợp các lớp của applet
với tập tin dữ liệu với nhau. Để nạp một hình ảnh từ server, một applet phải sử
dụng URL như đoạn mã trong ví dụ dưới đây:
public class SomeClass extends JApplet ... {
protected String leftButtonFilename = "images/left.gif";
...
public void init() {
...
URL leftButtonURL = getURL(leftButtonFilename);
...
leftButtonIcon = new ImageIcon(leftButtonURL,
"an arrow pointing left");
...
}
...
protected URL getURL(String filename) {
URL codeBase = getCodeBase();
URL url = null;
try {
url = new URL(codeBase, filename);
} catch (java.net.MalformedURLException e) {
System.err.println("Couldn't create image: " +
"badly specified URL");
return null;
The Image Icon API
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. constructors and methods. Lưu ý là ImageIcon không có nguồn gốc
từ JComponent hay thậm chí là từ Component.
Setting, Getting, and Painting the Image Icon's Image
Method or
Constructor
Purpose
ImageIcon()
ImageIcon(byte[])
ImageIcon(byte[],
String)
ImageIcon(Image)
ImageIcon(Image,
String)
ImageIcon(String)
ImageIcon(String,
String)
ImageIcon(URL)
ImageIcon(URL,
String)
Tạo một ImageIcon instance, khởi tạo nó để chứa hình ảnh
đã được xác lập. Tham số thứ nhất chỉ ra nguồn của hình
ảnh như image, số byte, tên tập tin, hay URL. Từ đó hình
ảnh sẽ được nạp lên. Nguồn của hình ảnh phải có dạng
thức file được hỗ trợ bởi lớp java.awt.Image có đuôi là
GIF hoặc JPEG.
void setImage(Image)
Image getImage()
Xác lập hoặc lấy image hiển thị bởi image icon.
ImageObserver
getImageObserver()
Set or get an image observer for the image icon.
int getImageLoadStatus()
Get the loading status of the image icon's image.
The set of values returned by this method are
defined by MediaTracker.
5. Sử dụng tiến trình(Threads)
Sử dụng tiến trình là một công việc khó khăn. Do đó nếu có thể được thì bạn nên
tránh phần này. Tuy nhiên Thread có thể giúp cải tiến chương trình của bạn bằng
cách quản lý sự thực thi.
Nguyên tắc đầu tiên khi sử dụng threads là: tránh dùng chúng nếu như có thể.
Threads có thể rất khó sử dụng và chúng có thể gây khó khăn khi chúng ta debug
chương trình. Để tránh trường hợp bị đình trệ của chương trình, cần phải quan
tâm ngay từ đầu rằng mỗi tiến trình được tạo ra không kêu gọi thực thi bất kỳ
một thành phần Swing nào.
Mặc dù nguy hiểm, nhưng threads rất cso giá trị khi ta sử dụng chúng một cách
cẩn thận. Ta có thể cải thiện việc thực hiện chương trình. Đôi khi, một vài tiến
trình làm đơn giản mã hoặc cấu trúc của một chương trình. Sau đây là một vài
tình huống khi sử dụng tiến trình:
• To move a time-consuming initialization task out of the main
thread, so that the GUI comes up faster. Examples of time-consuming
tasks include making extensive calculations and blocking for network or
disk I/O (loading images, for example).
• To move a time-consuming task out of the event-dispatching
thread, so that the GUI remains responsive.
dxn1345262233.doc 25