Tải bản đầy đủ (.pdf) (55 trang)

Lap Trinh java bai giang chuong 4

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (813.47 KB, 55 trang )

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




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


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



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ứ



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


×