Bảng 1: Một số constructor của Dialog Ta cũng có các phương thức khởi tạo tương tự ứng cho trường hợp owner là một Frame.. Bảng 5: Một số phương thức cập nhật của Container Nếu Container
Trang 1AWT 1
1 Giới thiệu 1
2 Container 2
3 Một số control thường dùng 8
4 Layout manager 15
5 Menu 25
1 Giới thiệu
1.1 Về AWT
AWT (Abstract Window Toolkit) là một package có sẵn trong JDK (java.awt), nó cung cấp các thành phần cơ bản để xây dựng các ứng dụng GUI (Graphics User Interface – Giao diện Người dùng Đồ họa)
Ứng dụng GUI được tạo ra bởi AWT sẽ không phụ thuộc vào hệ điều hành, có nghĩa là chúng sẽ trông như nhau ở mọi loại máy tính
1.2 Cấu trúc của AWT
AWT bao gồm nhiều class cho phép kế thừa, từ đó lập trình viên có thể tạo ra nhiều loại control (thành phần giao diện) đa dạng theo ý mình
Trang 2Hình 1: Cấu trúc của AWT
Như hình trên, ở cấp cao nhất của AWT có các class như BorderLayout, FlowLayout,
MenuComponent, Component, Graphics, Image, Polygon, Dưới đó là các class nhưButton, Canvas, MenuItem, Trong đó, Component và Container là hai class quan trọngcủa AWT Component là lớp cha của nhiều control thường dùng, còn Container là class
để chứa các Component khác
2 Container
các control khác (hoặc Container khác) bên trong nó
Thông thường, khi cần dùng các Container thì ta sẽ tạo ra class kế thừa từ chúng
Dimension Event Font FlowLayout FontMetrics Graphics GridBagLayout GridLayout Image Insets
Point Polygon Rectangle Toolkit MenuComponent
Component
FileDialog
Button Canvas Checkbox Choice Container
ScrollBar
Label List
Panel Window ScrollPane
Applet
Dialog Frame
TextComponent
TextField TextArea
MenuBar MenuItem
CheckboxMenuItem
AWTException AWTError Exception
Error
Trang 3Có hai loại Window là Frame và Dialog.
nhỏ hoặc thay đổi kích thước bằng mouse
modal Dialog sẽ "khóa" hết các cửa sổ khác của ứng dụng cho đến khi ta đóng Dialog
Trang 42.2 Các thao tác cơ bản trên Container
2.2.1 Khởi tạo một Container
Bản thân Container chỉ có một phương thức khởi tạo mặc định Tuy nhiên, các dẫn xuấtcủa Container là Window (gồm Dialog, Frame) và Panel, thì có nhiều phương thứckhởi tạo khác nhau
a Dialog
Khi tạo một Dialog, ta cần cho biết owner của nó Owner của Dialog là một Frame hoặcmột Dialog khác Nếu owner là null thì phương thức khởi tạo sẽ phát sinh
Ngoài ra, còn các phương thức khởi tạo kèm theo title và trạng thái modal của Dialog
Bảng 1: Một số constructor của Dialog
Ta cũng có các phương thức khởi tạo tương tự ứng cho trường hợp owner là một Frame
b Frame
Bảng 2: Một số constructor của Frame
c Panel
Như đã nói trên, Panel không thể tồn tại độc lập mà phải thuộc về Container nào đó
Bảng 3: Một số constuctor của Panel
Trang 5Sau khi tạo xong, cần phải đưa Panel vào một Container khác thì nó mới hoạt độngđược.
2.2.2 Thêm control vào Container
Để thêm control vào Container, ta dùng phương thức add() Phương thức này có cácdạng overloading như sau:
Thêm control có tên là name vào vị trí i của
Container Phương thức này không cònđược dùng dùng kể từ JDK 1.1
Bảng 4: Các phương thức add control vào Container
Nếu ta thêm control vào một Container đang được hiển thị trên màn hình thì phải gọiphương thức validate để Container tiến hành vẽ lại các control bên trong nó Nếu cầnthêm nhiều control cùng lúc, thì ta chỉ cần gọi validate một lần sau khi thêm controlcuối cùng
2.2.3 Điều chỉnh các thuộc tính của Container
Ta có thể thay đổi các thông số như kích thước, vị trí, của Container bằng các phươngthức sau:
tọa độ góc trên-trái của Container
rộng và chiều cao (tính bằng pixel)
void setFont(Font f) Đặt kiểu font cho Conatiner
void setLayout(LayoutManager mgr)
Đặt LayoutManager cho Container Đặt
null có nghĩa là không dùng
hình hay không
Bảng 5: Một số phương thức cập nhật của Container
Nếu Container là Frame hoặc Dialog, ta có thể dùng thêm các phương thức sau:
Trang 6Phương thức Ý nghĩa
void setResizable(boolean r)
Cho phép hoặc không cho phép người dùngchỉnh kích thước của Frame/Dialog bằngmouse
rộng và chiều cao (tính bằng pixel)
void setFont(Font f) Đặt kiểu font cho Conatiner
void setLayout(LayoutManager mgr)
Đặt LayoutManager cho Container Đặt
null có nghĩa là không dùng
Bảng 6: Một số phương thức cập nhật của Frame và Dialog
Với Dialog, ta còn có thể cập nhật trang thái modal của nó bằng phương thức void
2.2.4 Bố trí control trên Container
Trong Container, các control được sắp đặt dựa vào LayoutManager Tuy nhiên, ta cũng
có thể tự sắp đặt "thủ công" bằng cách disable LayoutManager của Container Cáchdùng LayoutManager sẽ được trình bày sau
Để disable LayoutManager, ta chỉ cần đặt LayoutManager của Container về null
Sau đó, ta sẽ dùng phương thức setLocation để xác định tọa độ cho từng control trênContainer
Sau khi đã sắp đặt xong, ta sẽ gọi hiển thị Container bằng phương thức setVisible
hoặc show
2.2.5 Ví dụ
Để dùng AWT, ta phải import package AWT vào các file source code:
import java.awt.*;
thức khởi tạo mặc định của Frame01, ta sẽ điều chỉnh các thông số như tiêu đề, vị trí, kíchthước cho phù hợp Sau đó sẽ thêm một Panel vào Frame
// Khai báo Frame01 kế thừa từ Frame
public class Frame01 extends Frame
Trang 7this.setTitle( "AWT Frame" ); // Đặt tiêu đề cho Frame
chuẩn Owner của Dialog này sẽ là Frame vừa tạo ở trên Sau khi tạo, ta sẽ chỉnh tiêu đề,
vị trí, kích thước rồi thêm vào nó một Label và một Button
public class Dialog01 extends Dialog
{
private Button bt=new Button();
private Label lb=new Label();
public Dialog01(Frame frm)
{
super(frm); // Gọi constructor của Dialog
Gọi hiển thị Frame và Dialog vừa tạo:
public class AWT01
{
public static void main(String[]args)
{
}
Trang 83 Một số control thường dùng
3.1 Tổng quát
Để tạo một control và đưa nó lên màn hình, dù nó thuộc loại nào, thông thường ta phảiqua các bước sau (ở đây chưa nói tới việc dùng LayoutManager):
Khai báo và khởi tạo control (bằng từ khóa new)
Đặt text cho control (nếu có) bằng constructor hoặc phương thức
Chỉnh kích thước của control bằng phương thức setSize(int w, int h)
Chỉnh vị trí của control bằng phương thức setLocation(int x, int y)
Thêm control vào một Container bằng phương thức add(Component c)
Trang 9Phương thức / Constructor Ý nghĩa
Đặt kiểu canh lề cho Label, gồm:
Bảng 7: Các phương thức chính của Label
Trang 10Phương thức / Constructor Ý nghĩa
Bảng 8: Các phương thức chính của Button
Ví dụ:
Button bt=new Button( "OK" ); // Tạo button với nhãn là "OK"
Lưu ý: TextField chỉ cho nhập liệu trên một dòng, nghĩa là không cho phép xuống dòng.Các phương thức / constructor cần lưu ý:
thay đổi nội dung của TextField
Bảng 9: Các phương thức chính của TextField
Trang 11Nếu ta không cho phép người dùng sửa nội dung, TextField sẽ có dạng sau:
Hình 8: TextField không cho thay đổi nội dung
3.5 Choice
Choice là control chứa sẵn các giá trị cho người dùng chọn lựa Điều này giúp việc nhậpliệu được nhanh chóng và không bị lỗi
Các phương thức cần lưu ý:
phát sinh sự kiện ItemEvent
Bảng 10: Các phương thức chính của Choice
Ví dụ:
c.setSize(50,22);
Trang 12Checkbox là control cho phép người dùng chọn lựa với các giá trị có sẵn, thường là ít hơn
Có hai loại Checkbox là Checkbox thường và Checkbox dạng radio Với Checkbox
thường, việc chọn nó không ảnh hưởng gì tới check box khác Còn với Checkbox dạngradio, việc chọn một Checkbox sẽ kéo theo việc bỏ chọn Checkbox đang được chọn trongcùng nhóm (CheckboxGroup)
Mặc định, khi tạo một Checkbox thì nó sẽ là loại thường, muốn nó thành Checkbox dạngradio thì ta phải đưa nó vào CheckboxGroup
Các phương thức cần lưu ý:
state)
Tạo Checkbox có sẵn nhãn và trạng thái(true = được chọn)
state, CheckboxGroup group)
(khi đó nó sẽ là Checkbox dạng radio)
thuộc về
boolean getState() Cho biết trạng thái chọn / không chọn của
Trang 13void setState(boolean state) Đặt trạng thái chọn / không chọn cho
Bảng 11: Các phương thức chính của Checkbox
Khi dùng CheckboxGroup, ta cần lưu ý các phương thức sau (CheckboxGroup chỉ cóconstructor mặc định):
nhóm
Bảng 12: Các phương thức chính của CheckboxGroup
Ví dụ tạo Checkbox thường:
Checkbox cb = new Checkbox ("Auto save" )
// Tạo 2 Checkbox và đưa vào group
Checkbox cbNam=new Checkbox( "Nam" ,cbgGioiTinh,true );
Checkbox cbNu =new Checkbox( "Nu" ,cbgGioiTinh,false);
Trang 141 mục, hiển thị cùng lúc 4 mục).
boolean multipleMode)
Tạo List với số mục hiển thị và trạng thái đachọn lựa biết trước
(khi dùng List đa lựa chọn)
void deselect(int index) Bỏ chọn mục thứ index
Bảng 13: Các phương thức chính của List
Ví dụ:
l.setSize(100,120);
l.setLocation(50,70);
Trang 15Để khắc phục khó khăn trên, Java cung cấp các lớp layout manager với tính năng chính làchỉnh vị trí và kích thước control một cách tự động.
Sau đó, tùy vào cách sắp đặt mà ta có từng lớp cụ thể Tài liệu này sẽ giới thiệu cáclayout manager thường dùng của AWT, bao gồm BorderLayout, FlowLayout,
Mỗi lớp container (Frame, Dialog, Panel, ) đều có một layout manager đi kèm, nếulayout manager là null thì sẽ trở thành sắp đặt control "thủ công" Để đặt layout managercho container, ta dùng phương thức setLayout() của lớp Container
4.1 Lớp GridLayout
Như tên gọi, layout manager này bố trí các control theo lưới, mỗi vị trí là một ô tronglưới, và các ô có kích thước như nhau Kích thước này được tự động điều chỉnh theo kíchthước lưới và container
Nếu số control ít hơn số ô thì các ô còn lại sẽ được để trống
Để tạo ra một border layout, ta dùng các phương thức sau:
số cột thì tùy vào số control thêm vào
khoảng cách giữa các ô kề nhau là hgap
Trang 16(ngang) và vgap (dọc)
Bảng 14: Các constructor của GridLayout
Ví dụ:
// Chỉnh title và kích thước của frame
this.setTitle( "Grid Layout" );
// Tạo grid layout 3 dòng, 4 cột
// Thêm các button vào frame
for(int i=0;i<10;i++)
Kết quả:
Hình 13: GridLayout
Chỉnh khoảng trống giữa các ô: dùng constructor thứ ba
Kết quả:
Trang 17Hình 14: GridLayout với khoảng trống giữa các ô
ĐôngEast
TâyWest
NamSouthTrung tâmCenter
Trang 18BorderLayout(int hgap, int vgap) Tạo border layout với khoảng cách giữa các
vùng là hgap (ngang) và vgap (dọc)
Bảng 15: Các constructor của BorderLayout
Khi thêm control vào container có border tayout, cần phải cho biết vị trí của control Vịtrí này được quy định thông qua các hằng số như sau:
// Chỉnh title và kích thước của frame
this.setTitle( "Border Layout" );
// Đặt layout manager cho frame
// Thêm các button vào frame
this.add(new Button( "Center" ) ,BorderLayout.CENTER);
Kết quả:
Hình 16: Frame dùng BorderLayout
Khi resize frame: các Button tự động resize theo
Trang 19Hình 17: Frame dùng BorderLayout sau khi resize
Chỉnh khoảng trống giữa các vùng: dùng constructor thứ hai
Các kiểu canh lề của flow layout được quy định như sau:
Trang 20 FlowLayout.LEADING: canh từ đầu dòng, nếu dùng kiểu trình bày từ trái qua phảithì đầu dòng sẽ là bên trái
phải thì đầu dòng sẽ là bên phải
Để tạo ra một flow layout, ta dùng các phương thức sau:
ngang-dọc là 5 pixel
Tạo flow layout với kiểu canh lề quy địnhbới thông số align, khoảng cách ngang-dọc
// Chỉnh title và kích thước của frame
this.setTitle( "Flow Layout" );
// Dùng flow layout mặc định
// Thêm các button vào frame
for(int i=0;i<10;i++)
Kết quả:
Hình 19: Frame với FlowLayout
Sau khi resize: các control tự xuống dòng và vẫn giữ kiểu canh lề như cũ
Trang 21Hình 20: Frame sau khi resize
Đổi qua kiểu canh lề phải: dùng contructor thứ hai
Kết quả:
Hình 21: Flow layout canh lề phải
4.4 Lớp CardLayout
Card layout cho phép ta add nhiều control vào container, nhưng trong một thời điểm chỉ
có một control được hiển thị, và control này chiếm toàn bộ container
Khi thêm một control vào card layout, ta phải cung cấp một String cho nó để card layoutdựa vào đó mà gọi control khi cần
Theo mặc định thì control thêm vào đầu tiên sẽ được hiển thị
Để tạo ra một flow layout, ta dùng các phương thức sau:
Tạo card layout với khoảng cách ngang-dọcgiữa control so với biên của container là
hgap và vgap
Hình 22: Các constructor của CardLayout
Trang 22Ví dụ:
// Chỉnh title và kích thước của frame
this.setTitle( "Card Layout" );
// Dùng card layout
// Thêm các button vào frame, dùng i làm chuỗi nhân dạng các button
for(int i=0;i<10;i++)
this.add(new Button( "Button " +i),String.valueOf(i));
Kết quả:
Hình 23: Frame dùng card layout
Để chỉ định control được hiển thị, ta dùng các phương thức sau:
chứa control đó
container chứa control đó
chứa control đó
chứa control đó
name
Ví dụ: Hiển thị button ứng với chuỗi "3" (đã add lúc trước)
cl.show(this, "3" );
Kết quả:
Trang 23Hình 24: Frame với button thứ 3 được hiển thị
4.5 Lớp GridBagLayout
Đây là một layout manager rất mạnh, tuy nhiên việc sử dụng layout manager này kháphức tạp nên không tiện trình bày ở đây Chi tiết xin xem trong Java API Documents.Trong thực tế, ta có thể phối hợp các layout manager ở trên thay cho gird bag layout
Ví dụ:
// Chỉnh title và kích thước của frame
this.setTitle( "Grid Bag Layout" );
// Dùng grid bag layout
// Thêm các button vào frame
Trong đó, phương thức themNut() như sau:
private void themNut(String s,GridBagLayout gb,GridBagConstraints c) {
Trang 24Button bt=new Button(s);
gb.setConstraints(bt,c);
}
Kết quả:
Hình 25: Frame với grid bag layout
4.6 Phối hợp các loại layout
Mỗi container chỉ được phép dùng một layout manager Để dùng nhiều layout managertrên một container, ta cần chia nó thành từng panel, sau đó trong mỗi panel ta dùng mộtlayout manager khác nhau
Ví dụ:
// Chỉnh title và kích thước của frame
this.setTitle( "Mixing Layouts" );
// Tạo ra các panel
// Chỉnh màu cho các panel để dễ phân biệt
pn1.setBackground(Color.pink);
pn2.setBackground(Color.green);
// Đặt layout manager cho các panel
// Đặt grid layout cho frame
// Đưa các panel vào frame
// Đưa các button vào panel pn1
for(int i=0;i<10;i++)
pn1.add(new Button( "Button " +i));
// Đưa các button vào panel pn2
Trang 25Để tạo menu, ta sẽ tạo một MenuBar, sau đó tạo các Menu rồi add vào MenuBar, sau cùng
là tạo các MenuItem rồi đưa chúng vào từng Menu tương ứng
Sau khi tạo xong, ta thêm menu vào Window bằng phương thức setMenuBar()
Ví dụ:
// Tạo menu bar
MenuBar mnb=new MenuBar();
// Tạo các menu
// Tạo các menu item
Trang 26Menu mnFileNew=new Menu( "New" ); // Menu con
MenuItem mnFileNewText=new MenuItem( "Text" );
MenuItem mnFileNewPicture=new MenuItem( "Picture" );
MenuItem mnFileOpen=new MenuItem( "Open" );
MenuItem mnFileClose=new MenuItem( "Close" );
MenuItem mnFileExit=new MenuItem( "Exit" );
MenuItem mnToolConvert=new MenuItem( "Convert" );
// Đưa các menu vào menu bar