Các lớp cơ sở của Java (Java Foundation Classes - JFC) cung cấp bộ công cụ lập trình trên Window trừu tượng AWT (Abstract Windowing Toolkit) để xây dựng những ứng dụng dựa trên giao diện đồ họa với người sử dụng (GUI- Graphics User Interface).
Gói java.awt cung cấp các chức năng nguyên thủy của AWT để: Quản lý cách bài trí các thành phần bên trong các đối tượng chứa,
Hỗ trợ để xử lý các sự kiện cần thiết cho sự tương tác của người sử dụng với hệ thống thông qua GUI,
Hình H7-2 Các thành phần của AWT và các lớp con của Container
Component
Lớp trừu tượng cơ sở của tất cả các thành phần cung cấp các chức năng để xử lý các sự kiện, thay đổi kích thước của thành phần, điều khiển font, màu và vẽ các thành phần.
Container
Một lớp chứa là một thành phần. Nó có thể bao gồm một số các thành phần khác và cũng có thể là các lớp chứa khác. Các lớp chứa (các lớp con của Container) hỗ trợ để xây dựng những giao diện đồ họa phức tạp với người sử dụng.
Panel
Bảng panel là một thành phần chứa lý tưởng để nhóm các thành phần khác và các panel khác để tạo ra cấu trúc phân cấp các thành phần.
Applet
Một applet là một lọai panel đặc biệt có thể sử dụng để phát triển những chương trình thực hiện trong Web Browser.
Window
Lớp Window đại diện cho Window ở mức đỉnh, trong đó không chứa tiêu đề, thực đơn hoặc các đường biên.
Frame
Một khung (frame) là tùy chọn được sử dụng để thay đổi kích thước, dịch chuyển Window và trong đó có thanh tiêu đề, thực đơn, các đường biên.
Dialog
Lớp Dialog định nghĩa một window độc lập, tùy chọn, có thể thay đổi lại được kích thước và trong đó chỉ có thanh tiêu đề và các đường biên.
Lớp Component
Lớp Component cung cấp các hàm tiện ích chung cho các lớp con của nó.
Dimension getSize()
void setSize(int width, int height) void setSize(Dimension d)
Hàm getSize() cho lại đối tượng thuộc lớp Dimension gồm width (chiều rộng), height (chiều cao) xác định kích thước của một thành phần tính theo pixel. Hàm setSize() đặt lại kích thước của thành phần.
Point getLocation()
void setLocation(int x, int y) void setLocation(Point p)
Hàm getLocation() cho lại tọa độ (kiểu Point) trên cùng bên trái (tọa độ gốc) của thành phần đang xét. Hàm setLocation() đặt lại các tọa độ được chỉ định cho một thành phần.
Rectangle getBounds() void setBounds(int x, int y) void setBounds(Rectangle r)
Hàm getBounds() cho lại đường biên là hình chữ nhật Rectangle bao gồm tọa độ gốc và chiều dài, chiều rộng của hình chữ nhật. Hàm setBounds() đặt lại đường biên cho một thành phần.
void setForeground(Color c) void setBackground(Color c)
Hàm setForeground() được sử dụng để đặt màu vẽ cho thành phần đồ họa, còn setBackground() đặt màu nền cho thành phần đồ họa. Các tham số của hai hàm này là đối tượng của lớp Color sẽ được giới thiệu ở phần sau.
Font getFont() void setFont(Font f)
Hàm getFont() được sử dụng để biết được font của các chữ đang xử lý trong thành phần đồ họa. Hàm setFont() đặt lại font chữ cho một thành phần.
void setEnabled(boolean b)
Nếu đối số b của hàm getEnabled() là true thì thành phần đang xét hoạt động bình thường, nghĩa là có khả năng kích hoạt (enable), có thể trả lời các yêu cầu của người sử dụng và sinh ra các sự kiện như mong muốn. Ngược lại, nếu là false thì thành phần tương ứng sẽ không kích hoạt được, nghĩa là không thể trả lời được các yêu cầu của người sử dụng. Lưu ý: Tất cả các thành phần giao diện khi khởi tạo đều được kích hoạt.
void setVisible(boolean b)
Một thành phần đồ họa có thể được hiển thị lên màn hình (nhìn thấy được) hoặc bị che giấu tùy thuộc vào đối số của hàm setVisible() là true hay false.
Lớp Container
Lớp Container là lớp con của lớp trừu tượng Component. Các lớp chứa (lớp con của Container) cung cấp tất cả các chức năng để xây dựng các giao diện đồ họa ứng dụng, trong đó có hàm add() được nạp chồng để bổ sung một thành phần vào lớp chứa cho trước.
là điểm khởi đầu của một ứng dụng với GUI và có thể chứa một số bảng panel, trong đó có thể lại chứa các thành phần giao diện khác. Kịch bản chung để xây dựng giao diện ứng dụng là:
Tạo ra một frame có tên, ví dụ “My Frame” : Frame guiFrame = new Frame(“My Frame”);
Xây dựng một cấu trúc phân cấp các thành phần bằng cách sử dụng hàm add() để bổ sung thêm panel hoặc những thành phần điều khiển GUI vào cấu trúc đó:
guiFrame.add(new Button(“OK”);// Đưa vào một nút (Button) có tên “OK”
Đặt lại kích thước cho frame sử dụng hàm setSize():
guiFrame.setSize(200, 300);// Đặt lại khung frame là 200, 300 Gói khung frame đó lại bằng hàm pack(): guiFrame.pack(); Làm cho frame đó nhìn thấy được: guiFrame.setVisible(true);
7.2.2 Các thành phần điều khiển của GUI
Các thành phần điều khiển của GUI là các lớp giao diện đồ họa, các lớp con của lớp Component cho phép tương tác với người sử dụng. Bảng B7.1 mô tả tóm tắt các lớp giao diện đồ họa nguyên thủy đó.
Để sử dụng được các thành phần giao diện đồ họa, cần phải thực hiện theo ba bước như sau:
1. Tạo ra một thành phần giao diện bằng cách sử dụng toán tử tạo lập tương ứng với thành phần đó, ví dụ: Button guiComponent = new Button(“OK”);
2. Bổ sung thành phần vừa được tạo ra vào thành phần chứa (frame), ví dụ: guiFrame.add(guiComponent);
3. Nhận và xử lý các sự kiện khi chúng xuất hiện, đặc biệt là các yêu cầu của người sử dụng.
Bảng B7.1 Các thành phần giao diện đồ họa trong AWT
Button Một nút (button) với tên gọi xác định, được thiết kế cho
một hành động và khi muốn thực hiện nó thì nhấn nút tương ứng.
Canvas Một thành phần tổng quát để vẽ và thiết kế các
thành phần giao diện đồ họa mới.
Checkbox Một hộp kiểm tra (Checkbox) có tên gọi và được sử dụng
để đánh dấu chỉ ra là một mục nào đó được kiểm tra hay không, tương ứng với hai trạng thái true hoặc false.
Choice Cài đặt thực đơn (menu) pop-up để chọn lựa khi thực
hiện, trong đó chỉ một mục hiện thời là được kích hoạt.
Label Nhãn (label) là một thành phần được hiển thị trên một
dòng và chỉ cho đọc.
List Danh sách các mục văn bản.
TextField Trường chứa các dòng văn bản (text) soạn thảo được.
TextArea Thành phần chứa các văn bản soạn thảo được.
Ví dụ 7.2 Tạo ra các nút và cách sử dụng chúng. import java.awt.*;
import java.applet.*;
public class CheckboxApplet extends Applet{ public void init(){
CheckboxGroup amGroup = new CheckboxGroup(); // Tạo ra nút có tên “Am cao” và không được chọn
Checkbox amCao = new Checkbox("Am cao", amGroup, false); // Tạo ra nút có tên “Am trung binh” và kích hoạt nó (đặt true) Checkbox amTBinh=new Checkbox("Am trung binh",true,amGroup); // Tạo ra nút có tên “Am thap” và không được chọn
Checkbox amThap = new Checkbox("Am thap", false); amThap.setCheckboxGroup(amGroup);
// Bổ sung các nút trên vào nhóm các thành phần add(amCao);
add(amTBinh); add(amThap); }
}
Ví dụ 7.3 Tạo ra một danh sách các mục và chọn lựa một trong số các mục đó.
import java.awt.*; import java.applet.*;
public class ChoiceApplet extends Applet{ public void init(){
Choice muc = new Choice(); // Tạo ra một thực đơn pop-up muc.add("Hoa don"); // Đưa mục “Hoa don” vào muc
muc.add("Don hang"); // Đưa mục “Đon hang” vào muc muc.add("Tai khoan"); // Đưa mục “Tai khoan” vào muc muc.add("Mat hang"); // Đưa mục “Mat hang” vào muc add(muc); // Đưa muc vào khung ứng dụng
muc.select("Don hang"); // Chọn mục “Đon hang” }
}
Dịch và tạo ra tệp ChoiceApplet.html có lệnh đơn giản:
<applet code = "ChoiceApplet.class" width = 200 height = 200> </applet>
Thực hiện ChoiceApplet.html trong Web Browser, ví dụ Window Explore sẽ nhận được kết quả dạng:
Hình H7-3 Tạo ra danh sách các mục để chọn
7.2.3 Thành phần Menu
Lớp abstract class MenuComponent là lớp cơ sở cho tất cả các lớp thực hiện những vấn đề liên quan đến thực đơn (menu).
Lớp Menu cài đặt các thực đơn pull-down để có thể đưa vào một thực đơn bất kỳ.
Lớp PopUpMenu biểu diễn cho thực đơn pop-up .
Lớp CheckboxMenuItem chứa các mục được chọn để kiểm tra trong các mục thực đơn.
Việc tạo lập một thanh thực đơn cho một frame được thực hiện như sau:
1) Tạo ra một thanh thực đơn,
MenuBar thanhThDon = new MenuBar(); 2) Tạo ra một thực đơn,
Menu thucDon = new Menu(“Cac loai banh”); 3) Tạo ra các mục trong thực đơn và đưa vào thực đơn,
MenuItem muc = new MenuItem(“Banh day”); thucDon.add(muc); // Đưa muc vào thucDon 4) Đưa các thực đơn vào thanh thực đơn,
thanhThDon.add(thucDon); // Đưa thucDon vào thanhThDon 5) Tạo ra một frame và đưa thanh thực đơn vào frame đó.
Frame frame = new Frame(“Cac mon an”);
frame.add(thanhThDon); // Đưa thanhThDon vào frame
Ví dụ 7.4 Tạo lập và sử dụng các thực đơn.
import java.awt.*; import java.applet.*;
public class MenuDemo extends Applet{ public static void main(String args[]){
MenuBar thanhThDon = new MenuBar(); Menu thucDon = new Menu("Cac loai banh"); MenuItem b1 = new MenuItem("Banh day"); thucDon.add(b1);
MenuItem b3 = new MenuItem("Banh khoai"); thucDon.add(b3);
thucDon.addSeparator();// Tạo ra một thanh phân cách MenuItem b4 = new MenuItem("Banh gio");
thucDon.add(b4);
// Tạo ra mục “Banh ran” và đánh dấu để lựa chọn thucDon.add(new CheckboxMenuItem("Banh ran")); thanhThDon.add(thucDon);
Frame frame = new Frame("Cac mon an"); frame.setMenuBar(thanhThDon);
frame.pack();
frame.setVisible(true); }
}
Hình H7-4 Tạo ra các thực đơn
Ví dụ 7.5 Viết chương trình có giao diện đồ họa như sau:
để nhập vào số tiền gửi tiết kiệm và hệ thống sẽ tính và cho ra số tiền lãi, với lãi xuất ví dụ 10%. Người sử dụng nhập xong số lượng gửi, ví dụ 100, hệ thống sẽ hiển thị Tiền lãi: 10.0.
// LaiXuat.java import java.awt.Label; import java.awt.TextField; import java.awt.Event; import java.awt.Frame; import java.applet.Applet;
public class LaiSuat extends Applet{
Label l1 = new Label("So luong tien gui: "); Label l2; TextField t1; int num = 0; int getNum(){ int n; try{ n = Integer.valueOf(t1.getText()).intValue(); }catch (NumberFormatException e){
n = 0; }
return n; }
public void init(){
resize(400,300); // Đặt lại khung applet có kích thước 400ì300 add(l1); // Bổ sung nhãn l1 vào applet
t1 = new TextField(6);
add(t1); // Bổ sung trường text t1 vào applet l2 = new Label ("Nhap so tien ban gui"); add(l2); // Bổ sung nhãn l2 vào applet
}
public boolean handleEvent(Event e){
if(e.target instanceof TextField && e.id==Event.ACTION_EVENT) { num = getNum(); showTotal(num); return true; } return false; }
public static void main(String args[]){ LaiSuat gui = new LaiSuat(); gui.init();
Frame fr = new Frame("Trang Web gui tiet kiem"); fr.resize(400,300); // Đặt lại kích thước của frame
fr.add("Center", gui); // Bổ sung frame fr vào giữa trang applet fr.show();
} }
Ví dụ 7.6 Viết chương trình có giao diện đồ họa:
để nhập vào số lượng hàng bán được và giá bán, hệ thống sẽ tính và hiển thị số tiền bán được của một mặt hàng nào đó được tính bằng tích của số lượng và giá bán. Khi nhập xong số lượng, hay giá bán, người sử dụng phải nhấn phím ENTER báo cho hệ thống (trường Text) biết để nhận và xử lý theo sự kiện nhập dữ liệu vào trường Text.
// BanHang.java import java.io.*; import java.awt.Label; import java.awt.TextField; import java.awt.Event; import java.awt.Frame; import java.applet.Applet;
public class BanHang extends Applet{ Label l1 = new Label("So luong: "); Label l2 = new Label("Gia ban: "); Label l3 = new Label("Thanh tien:"); TextField t1, t2, t3;
int num = 0; float price, total; int getNum(){
int n; try{
n = Integer.valueOf(t1.getText()).intValue(); }catch (NumberFormatException e){
n = 0; // Khi số nhập vào không đúng format thì đặt là 0 } return n; } float getPrice(){ float p; try{ p = Float.valueOf(t2.getText()).floatValue(); }catch (NumberFormatException e){
p = 0.0F; }
return p; }
public void init(){ resize(100,300); add(l1); t1 = new TextField(6); add(t1); add(l2); t2 = new TextField(6); add(t2); add(l3); t3 = new TextField(6); add(t3); }
void showTotal(int k, float p){
t3.setText(String.valueOf(k*p)); }
public boolean handleEvent(Event e){// Xử lý các sự kiện nhập dữ liệu if (e.target instanceof TextField
&& e.id == Event.ACTION_EVENT && num == 0 ) num = getNum(); // Chuyển dãy các chữ số thành số else if (e.target instanceof TextField
&& e.id == Event.ACTION_EVENT && num != 0){ price = getPrice(); // Chuyển dãy các chữ số thành số showTotal(num, price); // Hiển thị kết quả ở trường Text t3 num = 0;
return true; }
return false; }
public static void main(String args[]){ BanHang sale = new BanHang();
fr.resize(100,300); fr.add("Center", sale); fr.show();
} }