Môn học: Lập trình cơ bản với Java
Chương IV: Lậ
Th
Mục í
– Yêu cầu:
Sau khi học xong bài này sinh viên sẽ nắm được:
g
C
n ắ h
hư
g
n g
n
n
ng g
n
nh
n
Số tiết lên lớp: 10
Bảng phân chia thờ lượng:
Stt
01
02
03
04
g
C
n ắ h
hư n g
n
nh
n
Nội dung
g
n
ng g
n
Tr ng tâm bài giảng:
C
g
n ắ h
hư
n g
n
g
n
ng g
n
nh
n
156
Số tiết
1
3
2
4
4.1. Mở ầu
Chương n
ng ấp cho sinh viên những ki n thứ
hương
(Graphic User Interface - GUI) củ
ơ
n để xây d ng giao di n
nh ứng dụng bằng ngôn ngữ java:
Những nguyên tắc thi t k giao di n.
Những hư
n, gói xây d ng giao di n: gồm những lớp (class), những giao ti p
(interface) qu n lý s ki n và những thành phần (components) xây d ng nên giao
di n người dùng.
B qu n lý trình bày (layout managers).
X lý s ki n.
Trong khuôn khổ giáo trình lập
k GUI ùng hư
ng h
4.2. Giới thi u
Thư
hương
R
ăn
n này chúng tôi trình bày vi c thi t
n awt (abstract windows toolkit). Vi c thi t k t GUI sẽ tr c quan,
uyển chuyển hơn h húng
giới thi
nh j
dụng hư
n JFC (Java Foundation Class) sẽ giớ được
n đề java nâng cao.
ư v n awt ([1] trang 82, [2] trang 367)
n awt là b
hư
n ùng để xây d ng giao di n người dùng cho m t
nh ứng dụng
đầ đủ các thành phần ơ
n Ch
Te
Giống như
hưng khác vớ
e L
Fe
Te
n như: L e
Ae S
Men
F me…
API ủa Windows, java cung cấp h người lập
h m API hư
n Che
nh hư
n awt.
n awt không phụ thu c h đ ề h nh Thư
là nền t ng ơ ở giúp cho chúng ta ti p cận vớ hư
Cấu trúc cây phân cấp của tất c những lớp
n mở r ng JFC hi u qu hơn
ng hư
n awt chúng ta có thể xem
chi ti t trong tài li u kèm theo b công cụ j2se (phần API Specification).
157
n awt
4.3. Các khái ni m cơ bản ([1] trang 86, [2] trang 375)
4.3.1. Component
Component là m
đố ượng có biểu diễn đồ họ được hiển thị trên màn hình mà
người dùng có thể ương
được. Chẳng hạn như những nút nhấn (button), những
… Lớp Component là m t lớp trừ
checkbox, những
ượng.
java.lang.Object
java.awt.Component
4.3.2. Container
C n
đố
ne
đố ượng vật chứa hay những đố ượng có kh năng
ượng khác lại. Những đố
he
n
n lý và nhóm
ượng con thu c thành phần w như:
… hỉ s dụng đượ
h
đư n
n
h ng hứa
(container).
M t số đố ượng container trong Java:
Panel: Đố ượng khung chứ đơn g n nhấ
ùng để nhóm
đố ượng, thành phần
con lại. M t Panel có thể chứa bên trong m t Panel khác.
java.lang.Object
+--java.awt.Component
+--java.awt.Container
+--java.awt.Panel
Frame: khung chứa Frame là m t c a số window hẳn hoi ở mức trên cùng bao gồm m t
đều và m
đường
n (
e ) như
ứng dụng w n
w
hông hường khác.
Khung chứ F me hường được s dụng để tạo ra c a sổ chính của các ứng dụng.
158
java.lang.Object
+--java.awt.Component
+--java.awt.Container
+--java.awt.Window
+--java.awt.Frame
Dialogs: đ y là m t c a sổ dạng h p h i thoại (c a sổ dạng n
window), c a sổ dạng n
li u nhập từ ng
hường đượ
hông
chẳng hạn. Dia g ũng
ùng để đư
òn được gọi là pop-up
hông
h
đố ượng, thành phần
n
ùng để lấy dữ
g như Te F e
m t c a sổ nhưng hông đầ đủ chứ năng như đố ượng
khung chứa Frame.
java.lang.Object
+--java.awt.Component
+--java.awt.Container
+--java.awt.Window
+--java.awt.Dialog
ScrollPanes: là m t khung chứ ương khung chứ P ne nhưng
em đượ
giúp ta tổ chứ
hình nh h
ăn
đố ượng lớn choán nhiều chỗ
h m 2 h nh ượt
n m n h nh như những
n nhiều dòng.
java.lang.Object
+--java.awt.Component
+--java.awt.Container
+--java.awt.ScrollPane
4.3.3. Layout Manager ([1] trang 180, [2] trang 378)
Khung chứa container nhận
th n
đố ượng từ
để tổ chức sắp x p “ hỗ ở” h
n ng
đố ượng đ
FlowLayout: Sắp x p
đều giữ ng
nh
m hư
đấ đ
qu n lý trình bày
n AWT cung cấp cho ta bao gồm:
đố ượng từ trái qua ph i và từ trên xuống ướ C
đố ượng
n í h hước của mình.
BorderLayout: C
đố ượng đượ đặt the
đường viền của khung chứa theo
các cạnh West, East, South, North và Center tứ Đông T
Trái, Ph
n ph i bi t làm
Mỗ đố ượng khung chứ đều
có m t b qu n lý chịu trách nhi m th c hi n công vi
(Layout Manager). Các b qu n
đư
T n Dưới và Giữa tùy theo cách nhìn của chúng ta.
159
m
ắc và Trung tâm hay
vừ
GridLayout: Tạo m
h ng ưới vô hình với các ô bằng nh
í h hước với từng ô đ
Thứ t sắp x p ũng ừ trái qua ph i và từ trên xuống ưới.
GridBagLayout: Tương
đư
m
ướ
ô h nh T
như G
L
C
đối ượng sẽ đặt
đố ượng khung chứ
nh n í h hướ
với 1 ô mà có thể là 2, 3 ô hay nhiề hơn ù
ũng được
đố ượng không nhất thi t ph i vừa
he
ng
c mà ta chỉ định thông qua
đố ượng GridBagConstraint.
Null Layout: Cách trình bày t
t đ ng làm tất c từ vi
Đối vớ
định í h hước củ
h
n
người lập trình ph i
đố ượng ũng như
nó trên màn hình. Ta không phụ thu c vào những ràng bu
4.4.Thiết kế GUI c
nh
đông
định vị trí của
n m ắc gì c .
c ươ
4.4.1.Tạo khung chứa cửa sổ c ươ
Thông hường để tạo c a sổ hính h
hương
Tạ đố ượng Frame.
định í h hước của Frame.
Thể hi n Frame trên màn hình.
Ví dụ:
import java.awt.*;
class FrameDemo{
public static void main(String args[]){
// Tạ đố ượng khung chứaFrame
Frame fr = new Frame("My First Window");
//
định í h hước, vị trí của Frame
fr.setBounds(0, 0, 640, 480);
// Hiển thị Frame
fr.setVisible(true);
}
}
Kết quả thực
c ươ
:
160
nh ứng dụng ta ti n h nh
ước:
4.4.2. Tạo h thống thực ơ
Đối vớ hư
n w để xây d ng h thống th
đơn h
hương
chúng ta có thể dùng các lớp MenuBar, Menu, MenuItem, MenuShortcut.
Ví dụ: Tạo h thống th
đơn h
hương
nh C
import java.awt.*;
import java.awt.event.*;
class Calculator{
public static void main(String[] args){
createMenu();
}
private static void createMenu(){
// Tao Frame ung dung
final Frame fr = new Frame();
fr.setLayout(new BorderLayout());
// Tao cac menu bar
MenuBar menu = new MenuBar();
Menu menuFile = new Menu("Edit");
MenuItem copyItem = new MenuItem("Copy Ctrl+C");
MenuItem pasteItem = new MenuItem("Paste Ctrl+V");
161
nh ứng dụng
menuFile.add(copyItem);
menuFile.add(pasteItem);
Menu menuHelp = new Menu("Help");
MenuItem hTopicItem = new MenuItem("Help Topics");
MenuItem hAboutItem = new MenuItem("About Calculator");
menuHelp.add(hTopicItem);
menuHelp.addSeparator();
menuHelp.add(hAboutItem);
menu.add(menuFile);
menu.add(menuHelp);
fr.setMenuBar(menu);
fr.setBounds(100, 100, 300, 200);
fr.setTitle("Calculator");
//fr.setResizable(false);
fr.setVisible(true);
// x lý bi n s ki n đ ng
a số ứng dụng.
fr.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
}
Kết quả thực
c ươ
:
162
4.4.3. Gắn Component vào khung chứa
Để gắn m t thành phần, m
húng
đố ượng component vào m t c a số (khung chứa)
ùng phương hức add củ đố ượng khung chứa container.
Ví dụ:
import java.awt.*;
class AddDemo{
public static void main(String args[]){
// Tạ đố ượng khung chứaFrame
Frame fr = new Frame("AddDemo App");
// Tạ đố ượng Component
n
O = new
n(“OK”);
// Gắn đố ượng nút nhấn vào khung chứa
fr.add(buttOk);
//
định í h hước, vị trí của Frame
fr.setSize(100, 100);
// Hiển thị Frame
fr.setVisible(true);
}
}
Kết quả thực
c ươ
:
163
4.4.4. Trình bày các Component trong khung chứa ([1] trang 180, [2] trang 378)
hư húng
đã
t khung chứa container nhận
và nó ph i bi t làm th n
đố ượng từ
để tổ chức sắp x p “ hỗ ở” h
n ng
đố ượng đ
ượng khung chứ đều có m t b qu n lý chịu trách nhi m th c hi n công vi
đư
Mỗ đối
đấ đ
b qu n lý trình bày (Layout Manager). Chúng ta sẽ tìm hiểu chi ti t về các kiểu trình bày
củ hư
n AWT.
In e f e L
M n ge định nghĩ giao ti p cho những lớp bi
được làm th nào
để trình bày những trong những containers
4.4.4.1. FlowLayout
public class FlowLayout extends Object implements LayoutManager, Serializable
Đối với m t container trình bày theo kiểu FlowLayout thì:
được sắp x p theo thứ t từ trái sang ph i và từ trên xuống
Các component gắn
ưới.
C
mp nen
í h hướ như m ng m ốn.
N u chiều r ng củ C n
tạo ra m t dòng mớ F wL
ne
hông đủ chỗ cho các component thì chúng t đ ng
hường đượ
ùng để để sắp x p các button trong 1
panel.
Chúng ta có thể đ ều chỉnh kho ng cách giữa các component.
Ví dụ:
import java.awt.*;
import java.lang.Integer;
class FlowLayoutDemo{
public static void main(String args[]){
Frame fr = new Frame("FlowLayout Demo");
164
fr.setLayout(new FlowLayout());
fr.add(new Button("Red"));
fr.add(new Button("Green"));
fr.add(new Button("Blue"));
List li = new List();
for (int i=0; i<5; i++){
li.add(Integer.toString(i));
}
fr.add(li);
fr.add(new Checkbox("Pick me", true));
fr.add(new Label("Enter your name:"));
fr.add(new TextField(20));
// phương hứ p
() được gọi sẽ làm cho c a sổ
// hi n hành sẽ
í h hước vừa vớ
í h hước
// trình bày bố trí những thành phần con của nó.
fr.pack();
fr.setVisible(true);
}
}
Kết quả thực
c ươ
:
4.4.4.2. BorderLayout
public
class
BorderLayout
extends
Object
implements
Serializable
Đối với m t container trình bày theo kiểu BorderLayout thì:
165
LayoutManager2,
B trình bày khung chứ được chia làm 4 vùng:NORTH, SOUTH, WEST, EAST và
CE TER (Đông T
h
đổ
ĐÔ G TÂY
m
ắc và trung tâm). B trình bày loại này cho phép sắp x p
í h hước của những components chứa trong nó sao cho vứa với 5 vùng
AM
ẮC, TRUNG TÂM.
Không cần ph i gắn component vào cho tất c các vùng. Các component ở vùng
NORTH và SOUTH có chiều cao tùy ý nhưng
h ều r ng đúng ằng chiều r ng vùng
chứa.
Các component ở vùng EAST và WEST có chiều r ng ù
nhưng
h ều cao
đúng ằng chiều cao vùng chứa.
Các component ở vùng CENTER có chiều cao và chiều r ng phụ thu c vào các
vùng xung quanh.
Ví dụ:
import java.awt.*;
class BorderLayoutDemo extends Frame{
private Button north, south, east, west, center;
public BorderLayoutDemo(String sTitle){
super(sTitle);
north = new Button("North");
south = new Button("South");
east
= new Button("East");
west = new Button("West");
center = new Button("Center");
this.add(north, BorderLayout.NORTH);
this.add(south, BorderLayout.SOUTH);
this.add(east, BorderLayout.EAST);
this.add(west, BorderLayout.WEST);
this.add(center, BorderLayout.CENTER);
}
public static void main(String args[]){
166
Frame fr = new BorderLayoutDemo ("BorderLayout Demo");
fr.pack();
fr.setVisible(true);
}
}
Kết quả thực
c ươ
:
4.4.4.3. GridLayout
public class GridLayout extends Object implements LayoutManager
Đối với m t container trình bày theo kiểu GridLayout thì:
B trình bày tạo m
C
h ng ưới vô hình với các ô bằng nhau.
đố ượng sẽ đặt vừ
í h hước với từng ô đ
và từ trên xuống ưới.
Ví dụ:
import java.awt.*;
public class GridLayoutDemo{
public static void main(String arg[]){
Frame f = new Frame("GridLayout Demo");
f.setLayout(new GridLayout(3,2));
f.add(new Button("Red"));
f.add(new Button("Green"));
f.add(new Button("Blue"));
f.add(new Checkbox("Pick me", true));
f.add(new Label("Enter name here:"));
167
Thứ t sắp x p từ trái qua ph i
f.add(new TextField());
f.pack();
f.setVisible(true);
}
}
Kết quả thực
c ươ
:
4.4.4.4. GridBagLayout
public class GridBagLayout extends Object implements LayoutManager2
(public interface LayoutManager2 extends LayoutManager)
Đối với m t container trình bày theo kiểu GridBagLayout thì: Các componets khi
đượ đư
h ng hứa sẽ đượ
GridLayout. Tuy nhiên khác vớ G
ph i vừa vớ 1 ô
nh
n 1 h ng ướ
L
í h hướ
ô h nh ương
đố ượng không nhất thi t
n h ng ưới mà có thể là 2, 3 ô hay nhiề hơn ù
mà ta chỉ định hông
như
he
ng
c
đố ượng GridBagConstraints.
Lớp GridBagConstraints dẫn xuất từ lớp Object. Lớp G
gC n
n
ùng để
chỉ định ràng bu c cho những components trình bày trong khung chứa container theo kiểu
GridBagLayout.
gridx, gridy: vị trí ô củ
h ng ưới vô hình mà ta sẽ đư đố ượng con vào
gridwidth, gridheight: í h hướ h
ùng
Insets: là m t bi n đố ượng thu c lớp In e
phân cách theo 4 chiề (
n
nh
h đố ượng con.
ùng để
định kho ng cách biên
ưới, trái, ph i).
weightx, weighty: chỉ định kho ng cách lớn
với nhau.
í ụ:
168
ương đối củ
đố ượng con
import java.awt.*;
public class GridBagLayoutDemo{
public static void main(String arg[]){
Frame f = new Frame("GridBagLayout Demo");
// Thiet lap layout manager
// Tao doi tuong rang buoc cho cach trinh bay
// GridBagLayout.
GridBagLayout layout = new GridBagLayout();
GridBagConstraints constraints = new GridBagConstraints();
f.setLayout(layout);
// Tao ra 9 nut nhan
String[] buttName = {"Mot", "Hai", "Ba", "Bon", "Nam", "Sau", "Bay",
"Tam", "Chin"};
Button[] buttons = new Button[9];
for(int i=0;i<9;i++){
buttons[i] = new Button (buttName[i]);
}
// Rang buoc cac nut nhan cach nhau 2 pixel
constraints.insets = new Insets(2,2,2,2);
// Qui dinh cac nut nhan se thay doi kich thuoc
// theo ca 2 chieu
constraints.fill = GridBagConstraints.BOTH;
// Rang buoc cho nut nhan thu 1
constraints.gridx = 1;
constraints.gridy = 1;
constraints.gridheight = 2;
constraints.gridwidth = 1;
layout.setConstraints(buttons[0], constraints);
// Rang buoc cho nut nhan thu 2
169
constraints.gridx = 2;
constraints.gridy = 1;
constraints.gridheight = 1;
constraints.gridwidth = 2;
layout.setConstraints(buttons[1], constraints);
// Rang buoc cho nut nhan thu 3
constraints.gridx = 2;
constraints.gridy = 2;
constraints.gridheight = 1;
constraints.gridwidth = 1;
layout.setConstraints(buttons[2], constraints);
// Rang buoc cho nut nhan thu 4
constraints.gridx = 1;
constraints.gridy = 3;
constraints.gridheight = 1;
constraints.gridwidth = 2;
layout.setConstraints(buttons[3], constraints);
// Rang buoc cho nut nhan thu 5
constraints.gridx = 3;
constraints.gridy = 2;
constraints.gridheight = 2;
constraints.gridwidth = 1;
layout.setConstraints(buttons[4], constraints);
// Rang buoc cho nut nhan thu 6
constraints.gridx = 4;
constraints.gridy = 1;
constraints.gridheight = 3;
constraints.gridwidth = 1;
layout.setConstraints(buttons[5], constraints);
170
// Tu nut thu 7 tro di khong can rang buoc
// thay vi doi kich thuoc
constraints.fill = GridBagConstraints.NONE;
// Rang buoc cho nut nhan thu 7
constraints.gridx = 1;
constraints.gridy = 4;
constraints.gridheight = 1;
constraints.gridwidth = 1;
constraints.weightx = 1.0;
layout.setConstraints(buttons[6], constraints);
// Rang buoc cho nut nhan thu 8
constraints.gridx = 2;
constraints.gridy = 5;
constraints.gridheight = 1;
constraints.gridwidth = 1;
constraints.weightx = 2.0;
layout.setConstraints(buttons[7], constraints);
// Rang buoc cho nut nhan thu 9
constraints.gridx = 3;
constraints.gridy = 6;
constraints.gridheight = 1;
constraints.gridwidth = 1;
constraints.weightx = 3.0;
layout.setConstraints(buttons[8], constraints);
// Dua cac nut nhan khung chua chuong trinh
for (int i=0;i<9;i++)
f.add(buttons[i]);
f.pack();
f.setVisible(true);
171
}
}
Kết quả thực
c ươ
:
4.4.4.5. Null Layout
M t khung chứ được trình bày theo kiể
L
nghĩ
định í h hước của khung chứ
ph i t làm tất c từ vi
người lập trình
ũng như í h hước và vị
trí của từng đố ượng component trong khung chứa.
Để thi t lập cách trình bày là Null Layout cho m t container ta chỉ vi c gọ phương
thức setLayout(null) với tham số là null.
M t số phương hức của lớp trừ
hước củ
mp nen
h đư
ượng C mp nen
húng
ùng để định vị
định kích
h ng hứa trình bày theo kiểu kiểu t do:
Public void setLocation(Point p)
Public void setSize(Dimension p)
Public void setBounds(Rectangle r)
Ví dụ:
MyButton.setSize(new Dimension(20, 10));
MyButton.setLocation(new Point(10, 10));
MyButton.setBounds(10, 10, 20, 10);
í ụ:
import java.awt.*;
class NullLayoutDemo{
public static void main(String args[]){
172
Frame fr = new Frame("NullLayout Demo");
fr.setLayout(null);
Button buttOk = new Button("OK");
buttOk.setBounds(100, 150, 50, 30);
Button buttCancel = new Button("Cancel");
buttCancel.setBounds(200, 150, 50, 30);
Checkbox checkBut = new Checkbox("Check box", true);
checkBut.setBounds(100, 50, 100, 20);
List li = new List();
for(int i=0; i<5; i++){
li.add(Integer.toString(i));
}
li.setBounds(200, 50, 50, 50);
fr.add(buttOk);
fr.add(buttCancel);
fr.add(checkBut);
fr.add(li);
fr.setBounds(10, 10, 400, 200);
fr.setVisible(true);
}
}
Kết quả thực
c ươ
:
173
4.4.5. Các ố ượng khung chứa Container
hư húng
đã
n
ne
đố ượng khung chứa có kh năng
n lý và
đố ượng (components) khác trong nó.
chứ
Các components chỉ có thể s dụng đượ
h đư n
1 đố ượng khung chứa là
container.
Mỗ
n
ne hường gắn với m t LayoutManager (FlowLayout, BorderLayout,
GridLayout, GridBagLayout, Null Layout) qu định cách trình bày và bố trí các
components trong m t container.
Các lọai container trong java: Frame, Panel, Dialog, ScrollPanes.
4.4.5.1. Khung chứa Frame
java.lang.Object
+--java.awt.Component
+--java.awt.Container
+--java.awt.Window
+--java.awt.Frame
Khung chứa Frame là m t c a số window hẳn hoi ở mức trên cùng bao gồm m t
đều và m
đường
n (
e ) như
ứng dụng w n
w
hông hường khác.
Khung chứ F me hường được s dụng để tạo ra c a sổ chính của các ứng dụng.
qu n lý trình bày (LayoutManager)mặ
định là
4.4.5.2. Khung chứa Panel
java.lang.Object
+--java.awt.Component
+--java.awt.Container
+--java.awt.Panel
Khung chứa Panel có b qu n lý trình bày (LayoutManager) mặ
định là
Khung chứa Panel có b
FlowLayout.
FlowLayout.
Đối với khung chứa Panel thì các Panel có thể lồng vào nhau, vì vậy khung chứa
P ne hường đượ
ùng để bố trí các nhóm components bên trong m t khung chứa khác.
Ví dụ:
import java.awt.*;
public class PanelDemo extends Frame{
private Button next, prev, first;
174
private List li;
public PanelDemo(String sTitle){
super(sTitle);
next = new Button("Next >>");
prev = new Button("<< Prev");
first = new Button("First");
Panel southPanel = new Panel();
southPanel.add(next);
southPanel.add(prev);
southPanel.add(first);
// BorderLayout.SOUTH: vùng ưới
this.add(southPanel, BorderLayout.SOUTH);
Panel northPanel = new Panel();
northPanel.add(new Label("Make a Selection"));
// BorderLayout.NORTH: vùng trên
this.add(northPanel, BorderLayout.NORTH);
li = new List();
for(int i=0;i<10;i++){
li.add("Selection" + i);
}
this.add(li, BorderLayout.CENTER);
}
public static void main(String arg[]){
Container f = new PanelDemo("Panel Demo");
f.setSize(300, 200);
f.setVisible(true);
}
}
Kết quả thực
c ươ
:
175
4.4.5.2. Khung chứa Dialog
java.lang.Object
+--java.awt.Component
+--java.awt.Container
+--java.awt.Window
+--java.awt.Dialog
Dialog là m t lớp khung chứa t F me
òn được gọi là popup window. Có hai
loại dialog phổ bi n:
Modal Dialog: sẽ khóa tất c các c a số khác của ứng dụng khi dialog dạng này còn hiển
thị.
Non-Modal Dialog: vẫn có thể đ n các c a số khác của ứng dụng khi dialog dạng này
hiển thị.
M t c a sổ dạng Dialog luôn luôn ph i gắn với m t c a sổ ứng dụng (Frame).
Để tạo m
đố ượng khung chứa Dialog ta có thể dùng m t trong các constructor
của nó:
public Dialog (Frame parentWindow, boolean isModal)
public Dialog (Frame parentWindow, String title,boolean isModal)
parentWindow: c a sổ h
e:
đề của Dialog
isModal: true -> là Dialog dạng modal
isModal: false -> là Dialog không ph i dạng modal(hay non-modal)
4.5. Xử lý biến cố/sự ki n ([2] trang 405)
4.5.1. Mô hình xử lý sự ki n (Event-Handling Model)
Ở trên chúng ta chỉ đề cập đ n vấn đề thi t k giao di n hương
hư đề cập đ n vấn đề x lý s ki n. Những s ki n đượ ph
ương
ới giao di n hương
nh (GUI)
hững ương
176
nh ứng dụng mà
nh h người dùng
hường gặp như:
h
ển,
nhấn chu t, nhấn m t nút nhấn, chọn m t MenuItem trong h thống th
li u trong m
ô ăn b n đ ng
s ki n được gở đ n hương
a sổ ứng dụng … Kh
m
ương
nh Thông n ề s ki n hường đượ
đơn nhập dữ
y ra thì m t
ư
ữ trong m t
đố ượng dẫn xuất từ lớp AWTEvent. Những kiểu s ki n trong gói java.awt.event có thể
dùng cho c những
mp nen AWT
JFC Đối vớ hư
n JFC thì có thêm những
kiểu s ki n mới trong gói java.swing.event.
Những lớp sự ki n của gói java.awt.event
Có 3 y u tố quan trọng trong mô hình x lý s ki n:
Nguồn phát sinh s ki n (event source)
S ki n (event object)
B lắng nghe s ki n (event listener)
Nguồn phát sinh s ki n: là thành phần của giao di n m ngườ
ùng
S ki n: Tóm tắt thông tin về x ki n x y ra, bao gồm tham chi
đ ng.
đ n nguồn gốc
phát sinh s ki n và thông tin s ki n sẽ gởi đ n cho b lắng nghe x lý.
đố ượng của m t lớp hi n th c m t hay
B lắng nghe: M t b lắng nghe là m
nhiều interface củ g
ng hư
j
w e en h
j
w ng e en (đối với những component
n JFC) Kh được thông báo, b lắng nghe nhận s ki n và x lý. Nguồn phát
sinh s ki n ph i cung cấp những phương hứ để đăng
h ặc hủy bỏ m t b lắng nghe.
Nguồn phát sinh s ki n luôn ph i gắn với m t b lắng nghe, và nó sẽ thông báo với b
lắng nghe đ
h
ki n ph
nh đ
hư ậ người lập trình cần làm hai vi c:
177
đăng
Tạ
C đặ
m t b lắng nghe cho m t component trên GUI.
phương hức qu n lý và x lý s ki n.
Những interfaces lắng nghe của gói java.awt.event:
M
đố ượng Event-Listener lắng nghe những s ki n khác nhau phát sinh từ các
components của giao di n hương
nh Với mỗi s ki n h
nh
ph
nh h phương
thứ ương ứng trong những Event-Listener sẽ được gọi th c hi n.
Mỗi interface Event-Listener gồm m t hay nhiề
đặt trong các lớp hi n th
interface là trừ
( mp emen ) n e f e đ
hững phương hức trong các
ượng vì vậy lớp (b lắng nghe) nào hi n th c các interface thì ph i cài
đặt tất c những phương hứ đ
trừ
phương hức mà chúng cần cài
u không thì các b lắng nghe sẽ trở thành các lớp
ượng.
4.5.2. Xử lý sự ki n chuột
Java cung cấp hai intefaces lắng nghe (b
lắng nghe s
ki n chu t) là
MouseListener và MouseMotionListener để qu n lý và x lý các s ki n
thi t bị chu t. Những s ki n chu t có thể “ ẫ ” h
dẫn xuất từ java.awt.component.
C
phương hức của interface MouseListener:
178
n
nđ n
ất kỳ component nào trên GUI mà
public void mousePressed(MouseEvent event): được gọi khi m t nút chu
được
nhấnvà con trỏ chu t ở trên component.
public void mouseClicked(MouseEvent event): được gọi khi m t nút chu
được nhấn
và nh trên component mà không di chuyển chu t.
public void mouseReleased(MouseEvent event): được gọi khi m t nút chu t nh sa khi
kéo rê.
public void mouseEntered(MouseEvent event): được gọi khi con trỏ chu t vào trong
đường biên của m t component.
public void mouseExited(MouseEvent event): được gọi khi con trỏ chu t ra khỏ đường
biên của m t component.
C
phương hức của interface MouseMotionListener:
public void mouseDragged(MouseEvent even ): phương hứ n
được gọi khi người
dùng nhấn m t nút chu t và kéo trên m t component.
public void mouseMoved(MouseEvent event): phương hứ n
được gọi khi di chuyển
chu t trên component.
Mỗ phương hức x lý s ki n chu t có m t tham số MouseEvent chứa thông tin về
s ki n chu t phát sinh chẳng hạn như: ọ đ
phương hứ
nơ
ki n chu t x y ra. Những
ương ứng trong các interfaces sẽ t đ ng được gọi khi chu
ương
ới
m t component.
Để bi đượ ngườ
ùng đã nhấn nút chu t nào, chúng ta dùng những ph ơng hức,
những hằng số của lớp InputEvent (là lớp cha của lớp MouseEvent).
Ví dụ: Chương
củ
chu
nh n M
nef e M
eT
e
n ưới minh họa vi c dùng những phương hức
eL ene
M
eM
nL ene để “ ẫ ”
ương ứng.
import java.awt.*;
import java.awt.event.*;
public class MouseTracker extends Frame implements MouseListener,
MouseMotionListener{
private Label statusBar;
179
lý các s ki n
// set up GUI and register mouse event handlers
public MouseTracker(){
super( "Demonstrating Mouse Events" );
statusBar = new Label();
this.add( statusBar, BorderLayout.SOUTH );
// application listens to its own mouse events
addMouseListener( this );
addMouseMotionListener( this );
setSize( 275, 100 );
setVisible( true );
}
// MouseListener event handlers
// handle event when mouse released immediately
// after press
public void mouseClicked( MouseEvent event ){
statusBar.setText( "Clicked at [" + event.getX() + ", " + event.getY() + "]" );
}
// handle event when mouse pressed
public void mousePressed( MouseEvent event ){
statusBar.setText( "Pressed at [" + event.getX() + ", " + event.getY() + "]" );
}
// handle event when mouse released after dragging
public void mouseReleased( MouseEvent event ){
statusBar.setText( "Released at [" + event.getX() + ", " + event.getY() + "]"
);
}
// handle event when mouse enters area
public void mouseEntered( MouseEvent event ){
statusBar.setText( "Mouse in window" );
180