Định nghĩa Lập trình hướng Đối tượng (Objectoriented Programming).Nhận thức về Trừu tượng hóa Dữ liệu (Data Abstraction).Định nghĩa một Lớp (Class).Định nghĩa một Đối tượng (Object).Nhận thức được sự khác biệt giữa Lớp và Đối tượng.Nhận thức được sự cần thiết đối với phương thức Thiết lập (Construction) và Hủy (Destruction).Định nghĩa tính Bền vững (Persistence).Định nghĩa về tính đóng gói dữ liệu (Data Encapsulation)Hiểu biết về tính Thừa kế (Inheritance).Định nghĩa tính Đa hình (Polymorphism).Liệt kê những ưu điểm của phương pháp hướng Đối tượng.
Trang 1Chương 6
APPLETS
Sau khi học xong chương này, bạn có thể nắm được các nội dung sau:
Hiểu được các Applet của Java
Phân biệt applet và các ứng dụng thông thường
Tìm hiểu chu trình sống cuả một applet
Tạo các applet
Hiển thị các hình ảnh sử dụng applet
Truyền tham số cho applet
Tìm hiểu đồ hoạ, màu, font chữ trong Applet
java.applet
java.awt
6.2 Cấu trúc của một Applet
Một Applet định nghĩa cấu trúc của nó từ 4 sự kiện xảy ra trong suốt quá trìnhthực thi Đối với mỗi sự kiện, một phương thức được gọi một cách tự động.Các phương thức này được minh hoạ trong bảng 6.1
Điều quan trọng là không phải lúc nào applet cũng bắt đầu từ ban đầu Mà nóbắt đầu từ vị trí tiếp theo của quá trình thực thi trước đó
Ngoài những phương thức cơ bản này, còn có những phương thức ‘paint()’ và
‘repaint()’ Phương thức paint() dùng để hiển thị một đường thẳng (line), text,hoặc một hình ảnh trên nền applet Đối số của phương thức này là đối tượngcủa lớp Graphics Lớp này thuộc gói java.awt Câu lệnh sau được dùng đểimport lớp Graphics:
import java.awt.Graphics;
Phương thức Chức năng
init() Được gọi trong quá trình khởi tạo applet Trong quá trình khởi
tạo, nó sẽ tạo đối tượng để cung cấp cho applet Phương thứcnày được dùng để tải các hình ảnh đồ hoạ, khởi tạo các biến
và tạo các đối tượng
start() Được gọi gọi khi một applet bắt đầu thực thi Một khi quá
trình khởi tạo hoàn tất, thì applet được khởi động Phươngthức này được dùng để khởi động lại applet sau khi nó đãngừng trước đó
stop() Được gọi khi ngừng thực thi một applet Một applet bị ngừng
trước khi nó bị huỷ
destroy() Được dùng để huỷ một applet Khi một applet bị huỷ, thì bộ
Trang 2nhớ, thời gian thực thi của vi xử lý, không gian đĩa được trả
về cho hệ thống
Bảng 6.1: Các phương thức của một applet
Phương thức ‘repaint()’ được dùng khi cửa sổ cần cập nhật lại Phương thứcnày chỉ cần một thông số Tham số này là đối tượng của lớp Graphics
Applet sử dụng phương thức ‘showStatus()’ để hiển thị thông tin trên thanhtrạng thái Phương thức có tham số thuộc kiểu dữ liệu String Để lấy cácthông tin của applet, user có thể overide phương thức ‘getAppletInfo()’ củalớp Applet Phương thức này trả về 1 đối tượng kiểu String
Các phương thức của applet init(), start(), stop(), destroy(), và paint() đượcthừa kế từ một applet Nhưng mặc định những phương thức này không thựcthi một thao tác nào cả
Đây là ví dụ đơn giản của applet Câu lệnh sau tạo một lớp có tên là ‘Applet1’,lớp này sẽ kế thừa tất cả các phương thức và biến của lớp ‘applet’
public class Applet1 extends Applet
Phương thức init() và paint() thường được dùng để thực hiện một số hàm đểkhởi tạo và vẽ applet Phương thức ‘g.drawString()’ chỉ ra vị trí mà đoạn vănbản được vẽ ở đâu trên màn hình
Chương trình 6.1 hiển thị một chuổi ở dòng 70 và cột 80:
Trang 3Sử dụng cú pháp sau để dịch một Applet:
javac Applet1.java
Để thực thi một applet, ta cần tạo một file HTML File HTML này sử dụng thẻapplet Thẻ applet này lấy tham số đầu tiên là đường dẩn của file applet.Thẻ applet có hai thuộc tính sau:
Lúc này, ta có thể thực thi applet này bằng cách dùng trình xem applet Đây
là công cụ của JDK Để chạy file HTML trong trình xem applet, ta gõ câu lệnhsau:
appletviewer abc.html // ‘abc.html’ là tên của file HTML
Một tuỳ chọn khác của applet là ta thêm thẻ applet như là một dòng chú thíchtrong đoạn code Lúc đó, applet được dịch, và thực thi bằng cách sử dụnglệnh sau:
appletviewer Applet1.java
Sau đây là kết quả của chương trình trên:
Hình 6.1 Applet
Trang 46.2.1 Sự khác nhau giũa Application và Applet
Sau đây là sự khác nhau giữa application và applet:
Để thực thi các application chúng ta dùng trình thông dịch java, trongkhi đó applet có thể chạy được trên các trình duyệt (có hổ trợ Java) hay
sử dụng công cụ appletViewer, công cụ này đi kèm với JDK
Quá trình thực thi của application bắt đầu từ phương thức ‘main()’ Tuynhiên applet thì không làm như vậy
Các application sử dụng ‘System.out.println()’ để hiển thị kết quả ramàn hình trong khi đó applet sử dụng phương thức ‘drawString()’ đểxuất ra màn hình
Một điều đáng lưu ý là một chương trình Java đơn lẻ thì có thể vừa làapplication vừa là applet Chức năng của applet được bỏ qua khi nó được thựcthi như là một application và ngược lại
Chương trình 6.2 sẽ minh hoạ điều này
Trang 56.2.2 Những giới hạn bảo mật trên applet
Có một số hạn chế mà applet không thể làm được Bởi vì các applet của Java
có thể phá hỏng toàn bộ hệ thống của người sử dụng Các lập trình viên Java
có thể viết các applet để xoá file, lấy các thông tin các nhân của hệ thống…
Vì thế, các applet của java không thể làm các việc sau:
Không thể đọc hoặc ghi file trên hệ thống file của người sử dụng
Không thể giao tiếp với các site internet, nhưng chỉ có thể với các trangweb có applet mà thôi
Không thể chạy bất cứ chương trình gì trên hệ thống của người đọc
Không thể tải bất cứ chương trình được lưu trữ trong hệ thống củangười sử dụng
Những giới hạn trên chỉ đúng khi các applet được chạy trên trình duyệt
Trang 6Netscape Navigator hoặc Microsoft Internet Explorer.
6.3 Chu trình sống của một Applet
Chu trình sống của một Applet được mô tả ở sơ đồ dưới đây:
Hình 6.4 Chu trình sống của một applet
Trước tiên, applet được tạo
Bước kế tiếp là khởi tạo Điều này xảy ra khi một applet được nạp Quá trìnhnày bao gồm việc tạo các đối tượng mà applet cần Phương thức init() đượcđịnh nghĩa đè để cung cấp các hành vi để khởi tạo
Một khi applet được khởi tạo, applet sẽ được khởi động Applet có thể khởiđộng ngay cả khi nó đã được ngừng trước đó Ví dụ, nếu trình duyệt nhảy đếnmột liên kết nào đó ở trang khác, lúc đó applet sẽ bị ngừng, và được khởiđộng trở lại khi người sử dụng quay về trang đó
Sự khác nhau giữa quá trình khởi tạo và quá trình khởi động là một applet cóthể khởi động nhiều lần, nhưng qúa trình khởi tạo thì chỉ xảy ra một lần
Phương thức ‘start()’ được override để cung cấp các thao tác khởi động choapplet
Phương thức ‘stop()’ chỉ được gọi khi user không còn ở trang đó nữa, hoặctrang đó đã được thu nhỏ lại ở dưới thanh taskbar
Kế tiếp là phương thức ‘destroy()’ Phương thức này giúp applet dọn dẹp trướckhi nó được giải phóng khỏi vùng nhớ, hoặc trước khi truyệt duyệt kết thúc.Phương thức này được dùng để huỷ những luồng (thread) hay quá trình đangchạy
Phương thức ‘destroy()’ khác với phương thức finalize() là phương thứcdestroy() chỉ dùng cho applet, trong khi finalize() là cách tổng quát để dọndẹp applet
Phương thức paint() cũng là một phương thức quan trọng khác Phương thứcnày cho phép ta hiển thị một cái gì đó trên màn hình Có thể là text, đườngthẳng, màu nền, hoặc hình ảnh Phương thức này xảy ra nhiều lần trong suốtquá trình applet tồn tại Phương thức này thực thi một lần sau khi applet đượckhởi tạo Nó sẽ lặp đi lặp lại khi di chuyển từ cửa sổ trình duyệt sang cửa sổ
Trang 7khác Nó cũng xảy ra khi cửa sổ trình duyệt thay đổi vị trí của nó trên mànhình.
Phương thức ‘paint()’ có một tham số Tham số này là đối tượng của lớpGraphics Lớp Graphics thuộc lớp java.awt, chúng ta phải import trong đoạncode của applet Chúng ta có thể sử dụng đoạn mã sau:
import java.awt.Graphics;
6.4 Truyền tham số cho Applet
Trong chương trình sau, chúng ta sẽ truyền tham số cho applet Thành phầnnút ‘bNext’ có tên được truyền như là một tham số Phương thức ‘init()’ sẽkiểm tra tham số có tên là ‘mybutton’ Sau đó, nó tạo một nút với chuổi đónhư là tên của nút Nếu không có tham số truyền vào, nút đó có tên mặc định
là ‘Default’
Bây giờ chúng ta định nghĩa thẻ <PARAM> trong đoạn mã HTML như sau:
/*
<applet code=”Mybutton1” width=”100” height=”100”>
<PARAM NAME=”mybutton” value=”Display Dialog”>
<applet code="Mybutton1" width="200" height="100">
<PARAM NAME="mybutton" value="Display Dialog">
str = new String ("Default");
//when parameter is passedbNext = new Button(str);
add (bNext);
}
}
Trang 8Sau đây là kết quả của chương trình trên:
Hình 6.5: truyền tham số cho applet
Bây giờ chúng ta sẽ sử dụng lớp Graphics để vẽ các hình chẳng hạn như:đường thẳng, hình oval, và hình chữ nhật Chúng ta sẽ học lớp Font trong cácphần sau Lớp này có thể dùng để hiển thị văn bản bằng bất cứ font nào
Được gọi một cách tự động bởi phương thức ‘repaint()’
Phương thức này sẽ xoá những đối tượng đã vẽ, và truyền nó cho đốitượng của lớp Graphics để gọi phương thức ‘paint()’;
paint(Graphics g)
Được gọi bởi phương thức update()
Đối tượng được truyền cho phương thức này được dùng để vẽ Phương thức
Trang 9này dùng để vẽ các hình ảnh đồ hoạ khác nhau.
Việc gọi phương thức paint() lặp đi lặp lại thông qua phương thức repaint() sẽxoá đi các hình đã vẽ trước đó Để vẽ các hình mới mà vẫn giữ lại những hình
đã vẽ trước đó, chúng ta cần override lại phương thức update()
public void update (Graphics g)
6.5.1 Vẽ các chuỗi, các ký tự và các byte
Chương trình sau minh hoạ các vẽ các chuỗi, ký tự và các byte
Để vẽ hoặc in một chuỗi, lớp Graphics cung cấp phương thức ‘drawString()’
Cú pháp như sau:
drawString (String str, int xCoor, int yCoor);
Ba tham số là:
Chuỗi cần vẽ
Toạ độ X trên frame, nơi chuỗi cần được vẽ
Toạ độ Y trên frame, nơi chuỗi cần được vẽ
Để vẽ hoặc xuất các ký tự trên frame, lớp Graphics cung cấp phương thức
‘drawChars’ Cú pháp như sau:
drawChars (char array[], int offset, int length, int xCoor, int yCoor);
Chú thích các tham số:
Mảng các ký tự
Vị trí bắt đầu, nới các ký tự được vẽ
Số các ký tự cần được vẽ
Toạ độ X, nơi các ký tự cần được vẽ
Toạ độ Y, nơi các ký tự cần được vẽ
Lớp Graphics cung cấp phương thức ‘drawBytes()’ để vẽ hoặc in các byte raframe Cú pháp của phương thức này như sau:
drawBytes (byte array[], int offset, int length, int xCoor, int yCoor);
5 tham số của phương thức trên là:
Mảng các byte
Trang 10 Vị trí offset hay vị trí bắt đầu.
g.drawString ("Good Morning", 50, 50);
g.drawString ("Good Afternoon", 50, 75);
g.drawString ("Good Night", 50, 100);
Trang 11Hình 6.6 Strings, characters và bytes
6.5.2 Vẽ đường thẳng (Line) và Oval
Sau đây là cú pháp của các phương thức được sử dụng để vẽ đường thẳng vàhình oval:
drawLine (int x1, int y1, int x2, int y2);
drawOval (int xCoor, int yCoor, int width, int height);
setColor (Color c);
fillOval (int xCoor, int yCoor, int width, int height);
Phương thức ‘drawLine()’ nhận các tham số sau:
Toạ độ X, nơi bắt đầu vẽ (x1)
Toạ độ Y, nơi bắt đầu vẽ (y1)
Toạ độ X, nơi kết thúc vẽ (x2)
Toạ độ Y, nơi kết thúc vẽ (y2)
Phương thức này bắt đầu vẽ tại toạ độ ‘x1’ và ‘y1’, và kết thúc tại toạ độ ‘x2’
và ‘y2’ Để vẽ nhưng đường thẳng có màu, chúng ta thiết lập một màu nào
đó Phương thức ‘setColor’ dùng để thiết lập màu cho hình ảnh đồ hoạ Trongchương trình này, chúng ta sử dụng câu lệnh sau để chọn màu xanh:
g.setColor (Color.blue);
Phương thức ‘drawOval()’ nhận 4 thông số sau:
Toạ độ X
Toạ độ Y
Chiều rộng của hình Oval
Chiều cao của hình Oval
Trang 12Đối với hình oval rộng, thì giá trị của chiều rộng lớn hơn chiều cao, và ngượclại đối với hình oval cao.
Phương thức ‘fillOval()’ nhận 4 thông số, nhưng nó sẽ tô hình oval Sử dụngphương thức setColor để đặt màu tô
g.setColor(Color.cyan);
Ở đây, hình oval sẽ được tô với màu cyan Lớp Color cung cấp các màu khácnhau mà hệ thống có hổ trợ
6.5.3 Vẽ hình chữ nhật (Rectangle) và hình chữ nhật bo góc (Rounded Rectangle)
Sau đây là cú pháp của các phương thức được dùng để vẽ hình chữ nhật vàhình chữ nhật bo góc:
drawRect (int xCoor, int yCoor, int width, int height);
fillRect (int xCoor, int yCoor, int width, int height);
drawRoundRect (int xCoor, int yCoor, int width, int height, int arcwidth,int archeight);
fillRoundRect (int xCoor, int yCoor, int width, int height, int arcwidth, intarcheight);
Phương thức ‘drawRect()’ được dùng để vẽ hình chữ nhật đơn giản Phươngthức này nhận 4 tham số sau:
Toạ độ X của góc trên bên trái
Toạ độ Y của góc trên bên trái
Chiều rộng của hình chữ nhật
Chiều cao của hình chữ nhật
Phương thức này vẽ hình chữ nhật có chiều rộng và chiều cao cho trước, bắtđầu tại toạ độ X, Y Chúng ta có thể thiết lập màu của hình chữ nhật Ở đây,chúng ta chọn màu đỏ Câu lệnh sẽ như sau:
g.setColor (Color.red);
Phương thức ‘drawRoundRect()’ vẽ hình chữ nhật có các góc tròn Phươngthức này nhận 6 tham số, trong đó 4 tham số đầu thì giống với phương thứcdrawRect Hai tham số khác là:
arcwidth của hình chữ nhật
archeight của hình chữ nhật
Ở đây, ‘arcwidth’ làm tròn góc trái và góc phải của hình chữ nhật ‘archeight’làm tròn góc trên đỉnh và góc đáy của hình chữ nhật Ví dụ, arcwidth = 20 cónghĩa là hình chữ nhật được làm tròn cạnh trái và cạnh phải mỗi cạnh 10
Trang 13pixel Tương tự, archeight = 40 sẽ tạo ra hình chữ nhật được làm tròn từ đỉnhđến đáy 20 pixel.
Pìxel là đơn vị đo Nó là đơn vị nhỏ nhất trong vùng vẽ
Để tô hay vẽ hình chữ nhật và hình chữ nhật bo góc, chúng ta sử dụngphương thức ‘fillRect()’ và ‘fillRoundRect()’ Những phương thức này nhận cáctham số giống với phương thức drawRect() và drawRoundRect() Nhữngphương thức này vẽ các hình ảnh với một màu cho trước hoặc mới màu hiệnhành Lệnh sau dùng để vẽ hình với màu xanh:
là boolean Giá trị này True có nghĩa là hình chữ nhật là 3D
Phương thức ‘drawArc()’ nhận 6 tham số sau:
Toạ độ x
Toạ độ y
Chiều rộng của cung được vẽ
Chiều cao của cung được vẽ
Góc bắt đầu
Độ rộng của cung (góc của cung) so với góc ban đầu
Phương thức ‘fillArc()’ cũng nhận 6 tham số giống như phương thức drawArc(),nhưng nó vẽ cung và tô cung với màu hiện thời
6.5.5 Vẽ hình PolyLine
Chương trình sau lấy các điểm từ hai mảng để vẽ một loạt các đường thẳng
Cú pháp của phương thức này như sau:
drawPolyline (int xArray[], int yArray[], int totalPoints);
Trang 14 g.setFont (new Font(“Times Roman”, Font.BOLD, 15));
Phương thức ‘drawPolyline()’ nhận 3 tham số sau:
Mảng lưu trữ toạ độ x của các điểm
Mảng lưu trữ toạ độ y của các điểm
Tổng số điểm cần vẽ
Để vẽ các đường thẳng ta lấy các điểm từ hai mảng như sau:
(array1[0], array2[0]) (array1[1], array2[1]) (array1[2], array2[2])…
Số đường thẳng vẽ được luôn nhỏ hơn số truyền vào thông số thứ 3 củaphương thức drawPolyline() Ví dụ như: totalPoints - 1
Chương trình 6.5 minh hoạ các vẽ polyline
g.setFont (new Font("Times Roman", Font.BOLD, 15));
g.drawString("Current Color is black", 100, 100);
Trang 15Hình 6.7
6.5.6 Vẽ và tô đa giác (Polygon)
Lớp Graphics cung cấp hai phương thức để vẽ đa giác Phương thức đầu tiênnhận một đối tượng của lớp Polygon Phương thức thức 2 lấy hai mảng điểm,
và tổng số điểm cần vẽ Chúng ta sẽ sử dụng phương thức 2 để vẽ đa giác
Cú pháp của drawPolygon() như sau:
drawPolygon(int x[], int y[], int numPoints);
Cú pháp của fillPolygon() như sau:
fillPolygon (int x[], int y[], int numPoints);
Chương trình dưới đây lấy các điểm từ 2 mảng để vẽ đa gíac Phương thức
‘drawPolygon()’ nhận 3 tham số sau giống như phương thức drawPolyline()
Mảng lưu trữ toạ độ x của các điểm
Mảng lưu trữ toạ độ y của các điểm