Trong ph n này, ta s s d ng các l p đ i t ng đã đ c cài đ t trong ch ng này: ng n x p, hàng đ i, danh sách liên k t, cây nh phân và đ th .
Ch ng trình 5.8 cài đ t m t ch ng trình t ng h p, s d ng menu cho các đ i t ng: stack, queue, list. V i m i đ i t ng, có m t menu con t ng ng v i các thao tác trên đ i t ng đó. V i các đ i t ng còn l i, đ c coi nh bài t p m r ng c a ph n này.
Ch ng trình 5.8
package vidu.chuong5; public class CaseStudy3{
public static void main(String[] args) { try {
BufferedReader br =
while (true) {
System.out.println("**********************************"); System.out.println(" CASE STUDY 3 ");
System.out.println(" ---o0o--- "); System.out.println(" 1. Thao tac voi ngan xep "); System.out.println(" 2. Thao tac voi hang doi "); System.out.println(" 3. Thao tac voi danh sach "); System.out.println(" 10.Thoat! "); System.out.println("**********************************"); System.out.print(" |==> Chon chuc nang: ");
int function = Integer.parseInt(br.readLine()); CaseStudy3 ob3 = new CaseStudy3();
switch(function){ case 1: // Thao tác v i ng n x p ob3.stack(br); break; case 2: // Thao tác v i hàng đ i ob3.queue(br); break;
case 3: // Thao tác v i danh sách ob3.list(br); break; case 10: // Thoát kh i ch ng trình System.exit(1); } } } catch(Exception ex) {
System.out.println("Loi o ham 'main': "); ex.printStackTrace();
} }
/* Thao tác v i ng n x p */
public void stack(BufferedReader br){ MyStack stack = new MyStack(); try {
while (true) {
System.out.println("**********************************"); System.out.println(" THAO TAC VOI NGAN XEP ");
System.out.println(" ---o0o--- "); System.out.println(" 1. Them mot phan tu vao stack "); System.out.println(" 2. Lay mot phan tu ra khoi stack "); System.out.println(" 3. Lay het cac phan tu cua stack "); System.out.println(" 10.Thoat! "); System.out.println("**********************************"); System.out.print(" |==> Chon chuc nang: ");
int function = Integer.parseInt(br.readLine()); switch(function){
case 1: // Thêm m t ph n t vào ng n x p System.out.print(“Gia tri phan tu them vao:”); int phantu = Integer.parseInt(br.readLine());
stack.push(new Node(phantu)); break;
case 2: // L y m t ph n t ra kh i ng n x p Node node = stack.pop();
if(node != null)
System.out.println(“Phan tu lay ra: ” + node.getValue());
else
System.out.println(“Stack da rong!”); break;
case 3: // L y t t c các ph n t c a ng n x p System.out.println(“Cac phan tu cua ngan xep:”);
while(true){
Node node = stack.pop(); if(node == null)
break;
System.out.print(“ ” + node.getValue()); }
break;
case 10: // Thoát kh i ch ng trình con return; } } } catch(Exception ex) { ex.printStackTrace(); } }
/* Thao tác v i hàng đ i */
public void queue(BufferedReader br){ MyQueue queue = new MyQueue(); try {
while (true) {
System.out.println("**********************************"); System.out.println(" THAO TAC VOI HANG DOI "); System.out.println(" ---o0o--- "); System.out.println(" 1. Them mot phan tu vao queue "); System.out.println(" 2. Lay mot phan tu ra khoi queue "); System.out.println(" 3. Lay het cac phan tu cua queue "); System.out.println(" 10.Thoat! "); System.out.println("**********************************"); System.out.print(" |==> Chon chuc nang: ");
int function = Integer.parseInt(br.readLine()); switch(function){
case 1: // Thêm m t ph n t vào hàng đ i System.out.print(“Gia tri phan tu them vao:”); int phantu = Integer.parseInt(br.readLine());
queue.insert(new Node(phantu)); break;
case 2: // L y m t ph n t ra kh i hàng đ i Node node = queue.remove();
if(node != null)
System.out.println(“Phan tu lay ra: ” + node.getValue());
else
System.out.println(“Khong co phan tu nao!”); break;
case 3: // L y t t c các ph n t c a hàng đ i System.out.println(“Cac phan tu cua hang doi:”);
while(true){
Node node = queue.remove(); if(node == null)
break;
System.out.print(“ ” + node.getValue()); }
break;
case 10: // Thoát kh i ch ng trình con return;
} }
} catch(Exception ex) { ex.printStackTrace(); } }
/* Thao tác v i danh sách liên k t đ n */ public void list(BufferedReader br){
SimpleList list = new SimpleList(); try {
while (true) {
System.out.println("**********************************"); System.out.println(" THAO TAC VOI DANH SACH DON "); System.out.println(" ---o0o--- "); System.out.println(" 1. Them mot phan tu vao list "); System.out.println(" 2. Lay mot phan tu ra khoi list "); System.out.println(" 3. Duyet cac phan tu cua list "); System.out.println(" 10.Thoat! "); System.out.println("**********************************"); System.out.print(" |==> Chon chuc nang: ");
int function = Integer.parseInt(br.readLine()); switch(function){
case 1: // Thêm m t ph n t vào danh sách
System.out.print(“Gia tri phan tu them vao:”); int phantu = Integer.parseInt(br.readLine());
System.out.print(“Vi tri chen phan tu:”); int vitri = Integer.parseInt(br.readLine());
list.insert(new Node(phantu), vitri); break;
case 2: // L y m t ph n t ra kh i danh sách System.out.print(“Vi tri phan tu lay ra:”); int vitri = Integer.parseInt(br.readLine());
SimpleNode node = list.remove(vitri); if(node != null)
System.out.println(“Phan tu lay ra: ” + node.getValue());
else
System.out.println(“Khong co phan tu nao!”); break;
case 3: // L y t t c các ph n t c a danh sách System.out.println(“Cac phan tu cua danh sach:”);
Node[] nodes = list.travese(); for(int i=0; i<nodes.length; i++)
System.out.print(“ ” + nodes[i].getValue()); break;
case 10: // Thoát kh i ch ng trình con return; } } } catch(Exception ex) { ex.printStackTrace(); } } } T NG K T CH NG 5
N i dung ch ng 5 đã trình bày vi c bi u di n và cài đ t m t s c u trúc d li u tr u t ng trên Java, bao g m các gi i thu t:
• Ph ng pháp duy t • Ph ng pháp đ qui • Ph ng pháp s p x p • Ph ng pháp tìm ki m. Và các c u trúc d li u tr u t ng: • Ng n x p (stack) • Hàng đ i (queue)
• Danh sách liên k t (list): danh sách liên k t đ n và danh sách liên k t kép. • Cây nh phân (binary tree)
• th (graph): đ th không tr ng s và đ th có tr ng s .
H n n a, ch ng này c ng đã trình bày và minh ho cách s d ng các đ i t ng tr u t ng trong các ng d ng.
CÂU H I VÀ BÀI T P CH NG 5
1. Cài đ t b sung các ph ng th c s p x p khác vào l p Array trong m c 5.2.1: a. S p x p n i b t
b. S p x p ch n. c. S p x p vun đ ng d. S p x p tr n
2. Chuy n l p MyStack trong m c 5.3.1 thành m t ng n x p c a các kí t . Sau đó, dùng l p ng n x p m i đó đ đ o ng c m t xâu kí t do ng i dùng nh p vào t bàn phím.
3. Dùng l p MyQueue đ mô ph ng ch ng trình qu n lí ti n trình đ n gi n c a h đi u hành:
• M i ti n trình đ c mã hoá b ng m t kí hi u có ki u int. • Khi m t ti n trình xu t hi n, nó s đ c đ a vào m t hàng đ i. • Khi CPU r i, m t ti n trình trong hàng đ i s đ c l y ra th c hi n. Yêu c u vi t menu th c hi n ch ng trình:
• Thêm m t ti n trình • L y m t ti n trình ra
• Xem t t c các ti n trình đang có m t trong hàng đ i.
4. Thay đ i c u trúc l p Node c a danh sách liên k t, sao cho value có ki u là l p Employee
đã đ c đnh ngh a trong ch ng 4.
5. Dùng danh sách liên k t đ n v i c u trúc m i trong bài 4 đ qu n lí nhân viên c a m t công ty: Thêm vào m t nhân viên, xoá đi m t nhân viên, tìm ki m m t nhân viên theo m t tiêu chí c th (ti n l ng, tu i…), duy t t t c các nhân viên.
6. Dùng danh sách liên k t kép đ th c hi n bài s 5.
7. Vi t ch ng trình (d ng menu) đ áp d ng th c hi n các thao tác trên cây nh phân, s d ng l p BinaryTree trong m c 5.5.
8. Vi t ch ng trình (d ng menu) đ áp d ng th c hi n các thao tác trên đ th không tr ng s , s d ng l p Graph trong m c 5.6.1.
9. Vi t ch ng trình (d ng menu) đ áp d ng th c hi n các thao tác trên đ th có tr ng s , s d ng l p WeightedGraph trong m c 5.6.2.
CH NG 6
L P TRÌNH GIAO DI N TRÊN JAVA
N i dung ch ng này t p trung trình bày các v n đ liên quan đ n l p trình giao di n, v i s h tr c a m t s đ i t ng đ c cung c p s n b i Java:
• L p trình giao di n v i các đ i t ng c b n và v i các đ i t ng multimedia. • L p trình giao di n v i HTML&Applet
• L p trình giao di n v i SWING
6.1 GIAO DI N V I CÁC I T NG C B N
Trong m c này, chúng ta s tìm hi u và s d ng các đ i t ng c b n c a l p trình giao di n trong Java:
• Các đ i t ng khung ch a (container) c b n: Frame, Panel, Dialog.
• Các đ i t ng thành ph n (component) c b n: Button, Label, TextField, TextArea • Các s ki n c b n c a các đ i t ng.
Mu n s d ng các đ i t ng này, c n thêm l nh s d ng th vi n awt c a Java: import java.awt.*;
6.1.1 Các đ i t ng container c b n
Các đ i t ng container đ c dùng đ ch a các đ i t ng thành ph n khác. Các l p đ i t ng này có m t s ph ng th c chung nh sau:
• add(Object): Thêm m t đ i t ng (ki u component) vào container. • remove(Object): Lo i b m t đ i t ng ra kh i container.
• removeAll(): Lo i b t t c các đ i t ng mà container đang ch a.
• getComponent(int): Tr v đ i t ng thành ph n có ch s là tham s đ u vào. Container qu n lí các đ i t ng ch a trong nó d i d ng m ng. Ch s c a các thành ph n là s th t khi thành ph n đó đ c thêm vào container.
• getComponents(): Tr v m ng t t c các đ i t ng mà container đang ch a. • countComponents(): Tr v s l ng các đ i t ng mà container đang ch a.
Frame
Frame là m t đ i t ng có th dùng m t cách đ c l p, ho c đ c g n vào m t đ i t ng khác nh m t đ i t ng conponent bình th ng. Thông th ng, Frame đ c dùng nh m t c a s c a m t ch ng trình đ c l p. Các ph ng th c c b n c a l p Frame:
• Frame(): Kh i t o không tham s .
• Frame(String): Kh i t o v i tham s là dòng tiêu đ c a frame.
• setSize(int, int): nh kích c c a frame, tham s t ng ng là chi u r ng và chi u cao c a frame.
• setVisible(boolean): Cho phép frame xu t hi n hay n đi trên màn hình. • setTitle(String)/getTitle(): Truy nh p thu c tính dòng tiêu đ c a frame. • setResizable(boolean): Thi t l p thu c tính cho phép thay đ i kích c frame. • setIconImage(Image): Thi t l p nh icon góc trên (bi u t ng) c a frame. Ch ng trình 6.1 minh ho vi c s d ng m t đ i t ng c a l p Frame.
Ch ng trình 6.1
package vidu.chuong6; import java.awt.*; public class FrameDemo{
public static void main(String[] args) { // Khai báo và kh i t o frame có tiêu đ
Frame myFrame = new Frame(“This is my Frame!”); myFrame.setSize(300,150); // nh kích c frame myFrame.setVisible(true); // Hi n th frame } } Hình 6.1: K t qu demo Frame Panel
Panel c ng là m t dang khung ch a, nh ng khá đ n gi n. Panel ch dùng đ nhóm các đ i t ng giao di n v i nhau. Thông th ng, panel đ c dùng trong m t c a s c a Frame ho c m t ng d ng khác. Các ph ng th c c b n c a l p Panel, ngoài các ph ng th c chung c a container:
• Panel(): Kh i t o không tham s .
Ch ng trình 6.2 minh ho vi c s d ng m t Panel trong m t Frame.
Ch ng trình 6.2
package vidu.chuong6; import java.awt.*; public class PanelDemo{
public static void main(String[] args) { // Khai báo và kh i t o frame có tiêu đ
Frame myFrame = new Frame(“Frame has a panel!”); myFrame.setSize(300,150); // nh kích c frame
Panel myPanel = new Panel();// Khai báo panel myFrame.add(myPanel); // Thêm panel vào frame myFrame.setVisible(true); // Hi n th frame
} }
Hình 6.2: K t qu demo Panel
Dialog
Dialog là m t đ i t ng c a s con c a m t c a s ch ng trình chính. Do v y, Dialog ch đ c s d ng kèm v i m t Frame. Có hai d ng Dialog:
• Modal: Khi hi n c a s dialog, các c a s khác c a ch ng trình s b khoá l i, không thao tác đ c, ch thao tác đ c trên c a s dialog.
• Non-modal: Không khoá các c a s khác. Khi dialog xu t hi n, ng i dùng v n có th chuy n sang thao tác trên các c a s khác, n u c n.
Các ph ng th c c b n c a l p Dialog:
• Dialog(Frame, boolean): Kh i t o dialog, tham s th nh t là frame ch a dialog, tham s th hai xác đnh dialog có là modal hay không.
• Dialog(Frame, String, boolean): Kh i t o dialog, thêm tham s th hai là dòng tiêu đ c a dialog.
• setVisible(boolean): Thi t l p tr ng thái hi n th ho c n dialog trên màn hình. • setSize(int, int): nh kích c cho dialog, các tham s t ng ng là chi u r ng
và chi u cao c a dialog.
• setTitle(String)/getTitle(): Truy nh p thu c tính dòng tiêu đ c a dialog.
• setResizable(boolean): Thi t l p thu c tính cho phép thay đ i kích c c a dialog. • setLayout(Layout): Thi t l p ch đ hi n th các đ i t ng ch a trong dialog. Ch ng trình 6.3 minh ho vi c thêm m t dialog (đang r ng, ch a có đ i t ng thành ph n nào) vào m t frame.
Ch ng trình 6.3
package vidu.chuong6; import java.awt.*;
public class DialogDemo{
public static void main(String[] args) { // Khai báo và kh i t o frame có tiêu đ
Frame myFrame = new Frame(“Frame has a dialog!”); myFrame.setSize(300,150); // nh kích c frame
// Khai báo và kh i t o dialog
Dialog myDialog = new Dialog(myFrame, “An empty dialog!”, true); myDialog.setSize(300,150); // nh kích c dialog
myDialog.setVisible(true); // Hi n th dialog } } Hình 6.3: K t qu demo Dialog 6.1.2 Các đ i t ng component c b n Các đ i t ng component đ c dùng đ làm thành ph n c a các đ i t ng khung ch a, chúng không th dùng đ c l p, mà luôn ph i g n vào trong m t đ i t ng khung ch a container.
Label
Label (nhãn) là m t đ i t ng đ hi n th v n b n t nh, nh ng v n b n mà ng i dùng không th thay đ i tr c ti p đ c. Các ph ng th c c b n c a Label:
• Label(): Kh i t o m t nhãn r ng.
• Label(String): Kh i t o m t nhãn v i n i dung v n b n là tham s đ u vào. • Label(String, int): Kh i t o m t nhãn có n i dung s n, tham s th hai xác đnh cách
c n l c a nhãn so v i khung ch a, bao g m {Label.CENTER, Label.LEFT, Label.RIGHT}.
• setText(String)/getText(): Truy nh p n i dung v n b n c a nhãn.
• setAlignment(int)/getAlignment(): Truy nh p thu c tính c n l c a nhãn. • setFont(Font): nh d ng phông ch c a nhãn.
Ch ng trình 6.4 minh ho vi c s d ng nhãn trong m t frame.
Ch ng trình 6.4
package vidu.chuong6; import java.awt.*; public class LabelDemo{
public static void main(String[] args) { // Khai báo và kh i t o frame có tiêu đ
Frame myFrame = new Frame(“Frame has a label!”);
myFrame.setSize(300,150); // nh kích c frame
// Khai báo và kh i t o label Label myLabel = new Label();
myLabel.setText(“This is a label!”);//Gán n i dung v n b n myLabel.setAlignment(Label.CENTER);// C n l gi a
myFrame.setVisible(true); // Hi n th frame }
}
Hình 6.4: K t qu demo Label
TextField và TextArea
ây là hai đ i t ng dùng đ bi u di n v n b n và ng i dùng có th thay đ i n i dung v n b n ch a trong chúng. i m khác bi t là TextField ch cho phép m t dòng v n b n, trong khi TextArea cho phép ch a nhi u dòng v n b n. Các ph ng th c chung c a hai l p này:
• setText(String)/getText(): Truy nh p thu c tính n i dung v n b n ch a trong ô. • getSelectedText(): Tr v chu i v n b n đ c bôi đen (đánh d u ch n) trong ô. • getSelectedStart(): Tr v v trí kí t đ u trong vùng đ c đánh d u ch n (tính t 0). • getSelectedEnd(): Tr v v trí kí t cu i trong vùng đ c đánh d u ch n (tính t 0). • selectAll(): ánh d u ch n toàn v n b n.
• setEditable(boolean): Xác đnh vùng v n b n có th edit đ c hay không. Các ph ng th c khác c a l p TextField:
• TextField(): Kh i t o m t ô v n b n r ng.
• TextField(int): Kh i t o m t ô v n b n r ng, đ r ng xác đnh b i tham s vào. • TextField(String): Kh i t o m t ô v n b n có n i dung xác đnh b i tham s đ u vào. • TextField(String, int): Kh i t o v i n i dung có s n, đ r ng xác đnh.
• setEchoChar(char)/getEchoChar(): Truy nh p thu c tính là kí t thay th v n b n trong ô. Thu c tính này đ c dùng khi ta c n che d u thông tin v n b n, ví d , ô gõ m t kh u c a ch ng trình. • getColums(): Tr v đ r ng c a ô v n b n. Các ph ng th c khác c a l p TextArea: • TextArea(): Kh i t o m t vùng v n b n r ng. • TextArea(int, int): Kh i t o m t vùng v n b n r ng, kích c (s dòng, s c t) xác đnh b i tham s vào.
• TextArea(String): Kh i t o m t vùng v n b n có n i dung xác đnh b i tham s đ u vào.
• TextArea(String, int, int): Kh i t o vùng v n b n v i n i dung có s n, đ r ng xác đnh. • appendText(String): Thêm m t đo n v n b n vào cu i đo n v n b n trong vùng.
• insertText(String, int): Chèn m t đo n v n b n vào v trí xác đnh (tham s th hai) c a vùng v n b n.
• replaceText(String, int, int): Thay th m t đo n v n b n trong vùng, đánh d u b ng v trí b t đ u và v trí k t thúc (tham s th hai và th ba), b ng m t
đo n v n b n m i (tham s th nh t). • getRows()/getColums(): Tr v s dòng/c t c a vùng v n b n.
Ch ng trình 6.5 minh ho vi c đ t các đ i t ng ô v n b n và vùng v n b n vào m t frame.
Ch ng trình 6.5
package vidu.chuong6; import java.awt.*; public class TextDemo{
public static void main(String[] args) { // Khai báo và kh i t o frame có tiêu đ
Frame myFrame = new Frame(“Frame has some texts!”);
myFrame.setSize(300,150); // nh kích c frame
// Khai báo và kh i t o textField
TextField myTextField = new TextField(“A text field!”); myFrame.add(myTextField); // G n vào frame