Gới thiệu cơ chế ảo và trừu tượng
3.2. Các thành phần của AWT
a) Lớp Container
Container là đối tượng vật chứa hay những đối tượng có khả năng quản lý và nhóm các đối tượng khác lại. Ta có thể hiểu Container là vùng mà bạn có thể đặt các thành phần giao diện của bạn vào đó. Bất cứ vật gì mà kế thừa từ lớp Container
sẽ là vật chứa. Applet là một vật chứa, applet được dẫn xuất từ Panel, lớp Panel lại được dẫn xuất từ lớp Container.
Một vật chứa có thể chứa nhiều phần tử, các phần tử này có thể được vẽ hay được tô màu tuỳ thích. Bạn hãy xem vật chứa như một cửa sổ. Như khung (frame), pane, latch, hook, và các thành phần có kích thước nhỏ hơn khác.
Gói java.awt chứa một lớp gọi là Container. Lớp này trực tiếp hay gián tiếp phái sinh ra hai vật chứa được sử dụng phổ biến nhất là Frame và Panel.
Frame và Panel là các vật chứa thường được sử dụng. Frame là cửa sổ độc lập nhưng ngược lại Panel là vùng nằm trong cửa sổ khác. Panel không có các đường biên, chúng được trình bày trong một cửa sổ do trình duyệt hay appletviewer cung cấp. Appletviewer là một công cụ được JDK hỗ trợ để xem các applet. Frame là lớp con của Window. Chúng được trình bày trong một cửa sổ độc lập, cửa sổ này có chứa các đường biên xung quanh.
Một số đối tượng Container trong Java: Panel, Frame, Dialogs, ScrollPanes,…Sau đây ta sẽ tìm hiểu chi tiết hơn về các đối tượng này.
Frame
Frame không phụ thuộc vào applet và trình duyệt. Frame có thể hoạt động như một vật chứa hay như một thành phần (component). Bạn có thể sử dụng một trong những hàm tạo (constructor) sau để tạo một frame:
Frame(): hàm tạo không đối, dùng để tạo một frame nhưng không hiển thị
(invisible).
Frame(String title): hàm tạo có một đối số kiểu String, tạo một frame không
hiển thị, có tiêu đề.
Ví dụ: 7.3.2.1: Hiển thị một Frame trên cửa sổ:
import java.awt.*;
import java.awt.event.*;
class FrameDemo extends Frame
{
public FrameDemo(String title)
{
super(title);
}
public static void main(String args[])
{
FrameDemo myFrame=new FrameDemo("Frame Demo");
myFrame.setSize(300,200);
myFrame.setVisible(true);
myFrame.setBackground(Color.BLUE );
myFrame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent we)
{
System.exit(0);
}
});
}
}
Kết quả chương trình:
Panel
Panel được sử dụng để nhóm một số các thành phần lại với nhau. Cách đơn giản nhất để tạo một panel là sử dụng phương thức khởi tạo của nó, hàm tạo không đối Panel(). Panel không thể được nhìn thấy trực tiếp. Do đó, chúng ta cần thêm panel đến một frame. Vì vậy ta cần tạo một frame mới và thêm Panel mới được tạo này vào đó.
Ví dụ: 7.3.2.2: Hiển thị một Panel trên cửa sổ:
import java.awt.*;
import java.awt.event.*;
class PanelDemo extends Panel
{
public static void main(String args[])
{
PanelDemo myPanel=new PanelDemo();
myPanel.setBackground(Color.red );
Frame myFrame=new Frame("Panel Demo");
myFrame.add(myPanel);
myFrame.setSize(300,200);
myFrame.setVisible(true);
myFrame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent we)
{
System.exit(0);
}
});
}
}
Kết quả chương trình:
Đối với khung chứa Panel thì các Panel có thể lồng vào nhau, vì vậy khung chứa Panel thường được dùng để bố trí các nhóm components bên trong một khung chứa khác.
Dialog
Dialog là một lớp khung chứa tựa Frame và còn được gọi là popup window. Lớp Dialog tương tự như lớp Frame, nghĩa là Dialog là lớp con của lớp window. Cửa sổ dạng này thường được dùng để đưa ra thông báo, hay dùng để lấy dữ liệu nhập từ ngoài vào thông qua các đối tượng, thành phần trên dialog như TextField. Dialog cũng là một cửa sổ nhưng không đầy đủ chức năng như đối tượng khung chứa Frame.
Ví dụ: 7.3.2.3: Hiển thị một một Dialog trên cửa sổ, người dùng phải đóng Dialog này trước nếu muốn chuyển sang chức năng khác.
Frame myframe=new Frame(“My frame”); //Tạo frame với tiêu
để (“My frame”
String title = “Title”;
boolean modal = true; //Nhận giá trị true hoặc false
Dialog dlg=new Dialog(myframe, title, modal);
Tham số modal chỉ ra rằng dialog sẽ ngăn chặn bất kỳ tương tác nào xảy đến với các cửa sổ được mở khác, trong khi dialog đang được hiển thị trên màn hình. Kiểu hộp thoại này ngăn chặn người dùng tương tác với các cửa sổ khác (của cùng ứng dụng) trên màn hình, cho tới khi dialog được đóng lại.
ScrollPanes
ScrollPanes là một khung chứa tương tự khung chứa Panel, nhưng có thêm 2 thanh trượt giúp ta tổ chức và xem được các đối tượng lớn choán nhiều chỗ trên màn hình như những hình ảnh hay văn bản nhiều dòng.
Ví dụ: 7.3.2.4: Hiển thị một một TextArea nằm trong một khung chứa ScrollPanes.
import java.awt.*;
import java.awt.event.*;
class ScrollPaneDemo01
{
public static void main(String args[])
{
Frame myFrame = new Frame("My frame");
ScrollPane mySP=new ScrollPane();
TextArea myTextArea=new TextArea();
mySP.add(myTextArea);
myFrame.add(mySP);
myFrame.setSize(400,300);
myFrame.setVisible(true);
myFrame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent we)
{
System.exit(0);
}
});
}
}
Kết quả chương trình:
b) Lớp Component
Component là một đối tượng có biểu diễn đồ họa được hiển thị trên màn hình
mà người dùng có thể tương tác được, ví dụ như các điều khiển button, checkbox, scrollbar,… Lớp Component là một lớp trừu tượng.
TextComponent Button Label Checkbox List Choice Container Canvas Scrollbar C
o
m
p
o
n
e
n
t
TextField TextArea
Panel Window
Applet Frame Dialog
Hình 7.3.2a: Mô hình phân lớp lớp Component Một số phương thức của Component:
void setVisible(boolean): hiển thị hoặc ẩn component
Dimension getSize(): trả về kích thước của component
void setSize(Dimension): thay đổi kích thước
void setEnabled(): “bật” hoặc “tắt” component
void repaint(): cập nhật lại component
void update(Graphics g): được gọi qua repaint()
void paint(Graphics g): được gọi qua update()
void setBackground(Color): đặt màu nền
Lớp Container trong gói java.awt có 2 class phổ biến nhất là Frame và Panel. Frame là một cửa sổ tách biệt và có border. Panel là một vùng chứa không có border và nó được chứa trong một cửa sổ.
Một số điều khiển của lớp Component:
Label
Lớp này được sử dụng để hiển thị một xâu văn bản (String). Nó không thể được sửa đổi. Sử dụng một trong những hàm tạo (constructor) sau đây để tạo một label:
Label() //Tạo một Label rỗng.
Label(String labeltext) //Tạo một Label với nội dung truyền vào.
Label(String labeltext, int alignment) //Tạo một Label với một chế độ căn
lề alignment, có thể là Label.LEFT, Label.RIGHT hay Label.CENTER.
Các phương thức được sử dụng phổ biến của label được trình bày ở bảng bên dưới:
Phương thức Chức năng
setFont(Font f) Thay đổi phông chữ đang được chọn của Label
setText(String s) Thiết lập nhãn cho Label
getText() Lấy nội dung hiện hành của Label
Bảng 7.3.2.1: Các phương thức của Label
Ví dụ 7.3.2.5: Hiển thị một label có nội dung "Label Test" giữa cửa sổ ứng dụng.
import java.awt.*;
import java.awt.event.*;
class LabelTest extends Frame
{
Label label1=new Label("Label Test",Label.CENTER);
public LabelTest(String title)
{ super(title);
add(label1);
}
public static void main(String args[])
{
LabelTest myLabel =new LabelTest("Label");
myLabel.setSize(300,200);
myLabel.show();
myLabel.addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent we)
{ System.exit(0);
}
});
}
}
Kết quả chương trình:
TextField
Một textfield là một vùng chỉ chứa một dòng đơn, trong đó văn bản có thể được trình bày hay được nhập vào bởi người dùng. Trong Java, một trong những constructor sau có thể được sử dụng để tạo một textfield:
TextField(): Tạo một textfield mới.
TextField(int columns): Tạo một textfield mới với số cột được cho.
TextField(String s): Tạo một textfield mới với chuỗi văn bản được cho.
TextField(String s, int columns): Tạo một textfield mới với nhãn và số cột được cho.
Các phương thức thường được sử dụng của đối tượng TextField được tóm tắt trong bảng sau:
Phương thức Chức năng
setEchoChar(char) Thiết lập các kí tự được trình bày trong dạng của
một kí tự được cho.
setText(String s) Thiết lập nhãn cho TextField.
getText() Trả về nhãn của TextField.
setEditable(boolean) Xác định trường có thể được soạn thảo hay không.
Trường chỉ được soạn thảo khi giá trị này được đặt là True.
isEditable() Xác định xem trường có đang trong mode soạn
thảo hay không. Giá trị trả về kiểu Boolean.
Bảng 7.3.2.2: Các phương thức của TextField
Ví dụ 7.3.2.6: Hiển thị một TextField trên cửa sổ, người sử dụng có thể nhập dữ liệu vào TextField này.
import java.awt.*;
import java.awt.event.*;
class TextFieldTest extends Frame
{
TextField tf1=new TextField("text",30);
public TextFieldTest(String title)
{
super(title);
setLayout(new FlowLayout());
add(tf1);
}
public static void main(String args[])
{
TextFieldTest myTextField=new TextFieldTest("TextField Test");
myTextField.setSize(300,200);
myTextField.show();
myTextField.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent we)
{
System.exit(0);
}
});
}
}
Kết quả chương trình:
TextArea
Một Textarea được sử dụng khi văn bản nhập vào trên hai hay nhiều dòng. Textarea có một scrollbar. Thành phần TextArea là một trường văn bản có thể được soạn thảo với đặc tính nhiều dòng.
Để tạo một Textarea, làm theo các bước sau:
Tạo một phần tử (đối tượng TextArea).
Chỉ ra số dòng hay số cột phần tử này cần có.
Bố trí phần tử này trên màn hình.
Trong Java, bạn có thể sử dụng các constructor sau để tạo TextArea:
TextArea(): Tạo một TextArea mới.
TextArea(int rows, int cols): Tạo một TextArea mới với số lượng cột và
dòng được cho.
TextArea(String text): Tạo một TextArea mới với nhãn được cho.
TextArea(String text, int rows, int cols): Tạo một TextArea mới với nhãn,
số dòng và số cột được cho.
Các phương thức thường được sử dụng nhiều nhất của TextArea:
Phương thức Chức năng
setText(String) Thiết lập nhãn cho TextArea.
getText() Trả về nhãn của TextArea.
setEdiable(boolean) Xác định xem trường có thể được soạn thảo
hay không. Trường có thể được soạn thảo khi giá trị này là True.
isEdiable() Xác định xem trường có đang trong mode
soạn thảo được không. Trả về giá trị là kiểu Boolean.
insertText(String, int) Chèn String được cho vào vị trí index được
cho.
replaceText(String, int, int) Thay thế văn bản nằm giữa vị trí int, int
được cho.
Bảng 7.3.2.3: Các phương thức của TextArea
Ví dụ 7.3.2.7: Hiển thị một TextArea trên cửa sổ, người sử dụng có thể nhập dữ liệu vào TextArea này. Dữ liệu có thể được nhập trên nhiều dòng.
import java.awt.*;
import java.awt.event.*;
class TextAreaTest extends Frame
{
TextArea ta1=new TextArea("Type text here",5,30);
public TextAreaTest(String title)
{
super(title);
setLayout(new FlowLayout());
ta1.setEditable(true);
add(ta1);
}
public static void main(String args[])
{ TextAreaTest myTextArea=new TextAreaTest("TextArea Test");
myTextArea.setSize(300,200);
myTextArea.show();
myTextArea.addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent we)
{ System.exit(0);
}
});
}
}
Kết quả chương trình:
Button
Nút nhấn hay còn gọi là nút lệnh là một phần nguyên của bất kỳ GUI nào. Sử dụng button là cách dễ nhất để chặn các tác động của người dùng.
Để tạo một button, bạn làm theo các bước sau:
Tạo phần tử button với một nhãn chỉ ra mục đích của button.
Bố trí phần tử này trên màn hình.
Hiển thị phần tử trên màn hình.
Sử dụng một trong hai constructor sau để tạo các button trong Java:
Button() //Hàm tạo không đối số
Button(String text) //Hàm tạo nút lệnh với 1 đối số tiêu đề
Sử dụng các phương thức setLabel() và getLabel() để thiết lập và nhận về nhãn của button.
Ví dụ: 7.3.2.8: Hiển thị 3 nút lệnh (button) trên cửa sổ ứng dụng.
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.*;
class ButtonTest extends Frame
{
Button b1 = new Button("red");
Button b2 = new Button("Green");
Button b3 = new Button("Blue");
public ButtonTest(String title)
{
super(title);
setLayout(new FlowLayout());
add(b1);
add(b2);
add(b3);
}
public static void main(String args[])
{
ButtonTest myButton= new ButtonTest("Button");
myButton.setSize(300,200);
myButton.show();
myButton.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent we)
{
System.exit(0);
}
});
}
}
Kết quả chương trình:
Checkbox và RadioButton
Checkbox được sử dụng khi người dùng tiến hành chọn một hay nhiều tùy chọn. Người dùng phải click trên các checkbox để chọn hay bỏ chọn chúng. Một radiobutton cũng tương tự như một checkbox. Nó được sử dụng như một option button để xác định các chọn lựa. Bạn có thể chỉ chọn một button trong nhóm các nút radiobutton, ngược lại bạn có thể chọn nhiều hơn một checkbox tại một thời điểm. Làm theo các bước sau để tạo các checkbox hay radiobutton:
Tạo phần tử.
Quyết định trạng thái khởi đầu của phần tử (chọn hay không chọn).
Bố trí các phần tử trên màn hình.
Hiển thị các phần tử trên màn hình.
Thành phần checkbox có thể sử dụng một lớp phụ được gọi là CheckboxGroup để tạo ra các radiobutton.
Sử dụng các constructor sau để tạo các checkbox trong Java:
Checkbox(): Tạo một checkbox trống.
Checkbox(String text): Tạo một checkbox với nhãn được cho.
Để tạo các radiobutton, đầu tiên ta tạo đối tượng CheckboxGroup như sau:
CheckboxGroup cg=new CheckboxGroup();
Sau đó chúng ta tạo các button, như chỉ ra dưới đây:
Checkbox male=new Checkbox(“male”, cg, true);
Checkbox female=new Checkbox(“female”, cg, false);
Chúng ta sử dụng các phương thức setState() và getState() để thiết lập và nhận về trạng thái của checkbox.
Ví dụ: 7.3.2.9: Hiển thị 3 mục chọn (Checkbox) trên cửa sổ ứng dụng. Người sử dụng có thể chọn một hoặc nhiều hoặc không chọn mục nào.
import java.awt.*;
import java.awt.event.*;
class CheckboxTest extends Frame
{
Label l1=new Label("Color:");
Checkbox b1=new Checkbox("Red",false);
Checkbox b2=new Checkbox("Green",false);
Checkbox b3=new Checkbox("Blue",false);
public CheckboxTest(String title)
{
super(title);
setLayout(new GridLayout(8,1));
add(l1);
add(b1);
add(b2);
add(b3);
}
public static void main(String args[])
{
CheckboxTest myCheckBox=new CheckboxTest("Checkbox Test"); myCheckBox.setSize(300,200);
myCheckBox.show();
myCheckBox.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent we)
{
System.exit(0);
}
});
}
}
Kết quả chương trình:
Ví dụ: 7.3.2.10: Hiển thị 3 mục chọn (RadioButton) trên cửa sổ ứng dụng. Người
sử dụng chỉ có thể chọn tối đa một mục.
import java.awt.*;
import java.awt.event.*;
class CheckboxTest extends Frame
{
Label l1=new Label("Color:");
CheckboxGroup cbg=new CheckboxGroup();
Checkbox b1=new Checkbox("Red",cbg,false);
Checkbox b2=new Checkbox("Green",cbg,false);
Checkbox b3=new Checkbox("Blue",cbg,false);
public CheckboxTest(String title)
{
super(title);
setLayout(new GridLayout(8,1));
add(l1);
add(b1);
add(b2);
add(b3);
}
public static void main(String args[])
{
CheckboxTest myCheckBox=new CheckboxTest("Checkbox Test"); myCheckBox.setSize(300,200);
myCheckBox.show();
myCheckBox.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent we)
{
System.exit(0);
}
});
}
}
Kết quả chương trình:
Choice List
Thỉnh thoảng, rất cần thiết để trình bày một danh sách các chọn lựa đến người dùng trên một GUI. Người dùng có thể click vào một hay nhiều item từ danh sách. Một danh sách chọn lựa được tạo bằng cách sử dụng một số các chuỗi (String) hay các giá trị văn bản.
Để tạo các danh sách chọn lựa, hãy làm theo các bước được cho sau đây:
Tạo danh sách các phần tử.
Thêm các item (có kiểu là String) vào danh sách, mỗi lần chỉ thêm được một item.
Bố trí danh sách trên màn hình.
Hiển thị danh sách trên màn hình.
Java hỗ trợ lớp Choice cho phép chúng ta tạo các danh sách chứa nhiều item. Khi danh sách vừa được tạo ra, nó sẽ rỗng.
Choice myChoice = new Choice();
Mỗi thời điểm chỉ thêm được một item bằng cách sử dụng phương thức addItem như được chỉ ra bên dưới:
myChoice colors.addItem(“Red”);
myChoice colors.addItem(“Green”);
Ví dụ: 7.3.2.11: Hiển thị một ChoiceList với các tháng trong năm:
import java.awt.*;
import java.awt.event.*;
class ChoiceListTest extends Frame
{
Label l1=new Label("Chọn tháng:");
Choice months=new Choice();
public ChoiceListTest(String title)
{
super(title);
setLayout(new FlowLayout());
l1.setFont(new java.awt.Font("Times New Roman",1,13));
add(l1);
for (int i=1;i<=12;i++)
months.addItem("Tháng "+i);
add(months);
}
public static void main(String args[])
{
ChoiceListTest myChoiceList=new ChoiceListTest("ChoiceList Test");
myChoiceList.setFont(new java.awt.Font("Times New Roman",1,13));
myChoiceList.setSize(300,200);
myChoiceList.show();
myChoiceList.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent we)
{
System.exit(0);
}
});
}
}
Kết quả chương trình:
c) Lớp Layout manager
Layout manager điều khiển cách trình bày vật lý của các phần tử GUI như là button, textbox, option button v.v… Một layout manager tự động bố trí các thành
phần này trong container. Khung chứa container nhận các đối tượng từ bên ngoài đưa vào và nó phải biết làm thế nào để tổ chức sắp xếp “chỗ ở” cho các đối tượng
đó. Mỗi đối tượng khung chứa đều có một bộ quản lý chịu trách nhiệm thực hiện công việc đấy đó là bộ quản lý trình bày (Layout Manager). Các bộ quản lý trình bày mà thư viện AWT cung cấp cho ta bao gồm:
FlowLayout: Sắp xếp các đối tượng từ trái qua phải và từ trên xuống dưới.
Các đối tượng đều giữ nguyên kích thước của mình.
BorderLayout: Các đối tượng được đặt theo các đường viền của khung
chứa theo các cạnh West, East, South, North và Center tức Đông, Tây, Nam, Bắc và Trung tâm hay Trái, Phải, Trên, Dưới và Giữa tùy theo cách nhìn của chúng ta.
GridLayout: Tạo một khung lưới vô hình với các ô bằng nhau. Các đối
tượng sẽ đặt vừa kích thước với từng ô đó. Thứ tự sắp xếp cũng từ trái qua phải và từ trên xuống dưới.
GridBagLayout: Tương tự như GridLayout, các đối tượng khung chứa
cũng được đưa vào một lưới vô hình. Tuy nhiên kích thước các đối tượng không nhất thiết phải vừa với 1 ô mà có thể là 2, 3 ô hay nhiều hơn tùy theo các ràng buộc mà ta chỉ định thông qua đối tượng GridBagConstraint.
Null Layout: Cách trình bày tự do. Đối với cách trình bày này người lập
trình phải tự động làm tất cả từ việc định kích thước của các đối tượng, cũng như xác định vị trí của nó trên màn hình. Ta không phụ thuộc vào những ràng buộc đông, tây , nam, bắc gì cả.
Ví dụ 7.3.2.12: minh họa về FlowLayout Manager: các đối tượng từ trái qua phải và từ trên xuống dưới.
import java.awt.*;
import java.awt.event.*;
class FlowLayoutDemo extends Frame
{
Button btn1=new Button("Button 1");
Checkbox chb1=new Checkbox("Checkbox 1");
Checkbox chb2=new Checkbox("Checkbox 2");
public FlowLayoutDemo(String title)
{
super(title);