Đị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.
Chương APPLETS Sau học xong chương này, bạn nắm nội dung sau: Hiểu Applet Java Phân biệt applet ứng dụng thông thường Tìm hiểu chu trình sống cuả applet Tạo applet Hiển thị hình ảnh sử dụng applet Truyền tham số cho applet Tìm hiểu đồ hoạ, màu, font chữ Applet 6.1 Java Applet Applet chương trình Java chạy trình duyệt web Tất applet lớp lớp ‘Applet’ Lớp Applet thuộc package ‘java.applet’ Lớp Applet bao gồm nhiều phương thức để điều khiển trình thực thi applet Để tạo applet, bạn cần import hai gói sau: java.applet java.awt 6.2 Cấu trúc Applet Một Applet định nghĩa cấu trúc từ kiện xảy suốt trình thực thi Đối với kiện, phương thức gọi cách tự động Các phương thức minh hoạ bảng 6.1 Điều quan trọng lúc applet ban đầu Mà vị trí trình thực thi trước Ngoài phương thức này, có phương thức ‘paint()’ ‘repaint()’ Phương thức paint() dùng để hiển thị đường thẳng (line), text, hình ảnh applet Đối số phương thức đối tượng lớp Graphics Lớp thuộc gói java.awt Câu lệnh sau dùng để import lớp Graphics: import java.awt.Graphics; Phương thức init() start() stop() destroy() Chương 6: Applets Chức Được gọi trình khởi tạo applet Trong trình khởi tạo, tạo đối tượng để cung cấp cho applet Phương thức dùng để tải hình ảnh đồ hoạ, khởi tạo biến tạo đối tượng Được gọi gọi applet bắt đầu thực thi Một trình khởi tạo hoàn tất, applet khởi động Phương thức dùng để khởi động lại applet sau ngừng trước Được gọi ngừng thực thi applet Một applet bị ngừng trước bị huỷ Được dùng để huỷ applet Khi applet bị huỷ, 149 nhớ, thời gian thực thi vi xử lý, không gian đĩa trả cho hệ thống Bảng 6.1: Các phương thức applet Phương thức ‘repaint()’ dùng cửa sổ cần cập nhật lại Phương thức cần thông số Tham số đối tượng lớp Graphics Applet sử dụng phương thức ‘showStatus()’ để hiển thị thông tin trạng thái Phương thức có tham số thuộc kiểu liệu String Để lấy thông tin applet, user overide phương thức ‘getAppletInfo()’ lớp Applet Phương thức trả đối tượng kiểu String Các phương thức applet init(), start(), stop(), destroy(), paint() thừa kế từ applet Nhưng mặc định phương thức không thực thi thao tác Đây ví dụ đơn giản applet Câu lệnh sau tạo lớp có tên ‘Applet1’, lớp kế thừa tất phương thức biến lớp ‘applet’ public class Applet1 extends Applet Phương thức init() paint() thường dùng để thực số hàm để khởi tạo vẽ applet Phương thức ‘g.drawString()’ vị trí mà đoạn văn vẽ đâu hình Chương trình 6.1 hiển thị chuổi dòng 70 cột 80: Chương trình 6.1 import java.awt.*; import java.applet.*; public class Applet1 extends Applet { int num; public void init() { num = 6; } public void paint (Graphics g) { g.drawString (“Hello to Applet Chapter ” + num, 70, 80); showStatus (getAppletInfo()); //Hiển thị chuổi trả từ hàm getAppletInfo() //thanh trạng thái } public String getAppletInfo() //user overrides { return “Created by Aptech”; } } 150 Core Java Sử dụng cú pháp sau để dịch Applet: javac Applet1.java Để thực thi applet, ta cần tạo file HTML File HTML sử dụng thẻ applet Thẻ applet lấy tham số đường dẩn file applet Thẻ applet có hai thuộc tính sau: Width Height Để truyền tham số vào applet, sử dụng param, sau thuộc tính value Sau ví dụ thẻ applet: Lúc này, ta thực thi applet cách dùng trình xem applet Đây công cụ JDK Để chạy file HTML trình xem applet, ta gõ câu lệnh sau: appletviewer abc.html // ‘abc.html’ tên file HTML Một tuỳ chọn khác applet ta thêm thẻ applet dòng thích đoạn code Lúc đó, applet dịch, thực thi cách sử dụng lệnh sau: appletviewer Applet1.java Sau kết chương trình trên: Hình 6.1 Applet Chương 6: Applets 151 6.2.1 Sự khác giũa Application Applet Sau khác application applet: Để thực thi application dùng trình thông dịch java, applet chạy trình duyệt (có hổ trợ Java) hay sử dụng công cụ appletViewer, công cụ kèm với JDK Quá trình thực thi application phương thức ‘main()’ Tuy nhiên applet không làm Các application sử dụng ‘System.out.println()’ để hiển thị kết hình applet sử dụng phương thức ‘drawString()’ để xuất hình Một điều đáng lưu ý chương trình Java đơn lẻ vừa application vừa applet Chức applet bỏ qua thực thi application ngược lại Chương trình 6.2 minh hoạ điều Chương trình 6.2 import java.applet.Applet; import java.awt.*; /* */ public class both extends Applet { Button btn; public void init() { btn = new Button ("Click"); } public void paint (Graphics g) { g.drawString ("Applet", 70, 50); } public static void main (String args[]) { both app = new both(); app.init(); System.out.println("Application Main"); } } Sau biên dịch chương trình, thực thi applet cách sử dụng cú pháp sau: 152 Core Java appletviewer both.java Kết sau: Hình 6.2 Applet Nếu chạy chương trình application, sử dụng cú pháp sau: java both Kết là: Hình 6.3 Application Khi applet chạy trình duyệt web, đặc điểm thực hữu ích bạn muốn tải applet frame Ví dụ: applet tạo để chat, số website sử dụng cửa sổ chat riêng biệt để chat Bạn kết hợp đặc điểm frame applet vào chương trình 6.2.2 Những giới hạn bảo mật applet Có số hạn chế mà applet làm Bởi applet Java phá hỏng toàn hệ thống người sử dụng Các lập trình viên Java viết applet để xoá file, lấy thông tin nhân hệ thống… Vì thế, applet java làm việc sau: Không thể đọc ghi file hệ thống file người sử dụng Không thể giao tiếp với site internet, với trang web có applet mà Không thể chạy chương trình hệ thống người đọc Không thể tải chương trình lưu trữ hệ thống người sử dụng Những giới hạn applet chạy trình duyệt Chương 6: Applets 153 Netscape Navigator Microsoft Internet Explorer 6.3 Chu trình sống Applet Chu trình sống Applet mô tả sơ đồ đây: Destroy Creation Stop Starting Initalization Hình 6.4 Chu trình sống applet Trước tiên, applet tạo Bước khởi tạo Điều xảy applet nạp Quá trình bao gồm việc tạo đối tượng mà applet cần Phương thức init() định nghĩa đè để cung cấp hành vi để khởi tạo Một applet khởi tạo, applet khởi động Applet khởi động ngừng trước Ví dụ, trình duyệt nhảy đến liên kết trang khác, lúc applet bị ngừng, khởi động trở lại người sử dụng quay trang Sự khác trình khởi tạo trình khởi động applet khởi động nhiều lần, qúa trình khởi tạo xảy lần Phương thức ‘start()’ override để cung cấp thao tác khởi động cho applet Phương thức ‘stop()’ gọi user không trang nữa, trang thu nhỏ lại taskbar Kế tiếp phương thức ‘destroy()’ Phương thức giúp applet dọn dẹp trước giải phóng khỏi vùng nhớ, trước truyệt duyệt kết thúc Phương thức dùng để huỷ luồng (thread) hay trình chạy Phương thức ‘destroy()’ khác với phương thức finalize() phương thức destroy() dùng cho applet, finalize() cách tổng quát để dọn dẹp applet Phương thức paint() phương thức quan trọng khác Phương thức cho phép ta hiển thị hình Có thể text, đường thẳng, màu nền, hình ảnh Phương thức xảy nhiều lần suốt trình applet tồn Phương thức thực thi lần sau applet khởi tạo Nó lặp lặp lại di chuyển từ cửa sổ trình duyệt sang cửa sổ 154 Core Java khác Nó xảy cửa sổ trình duyệt thay đổi vị trí hình Phương thức ‘paint()’ có tham số Tham số đối tượng lớp Graphics Lớp Graphics thuộc lớp java.awt, phải import đoạn code applet Chúng ta 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, truyền tham số cho applet Thành phần nút ‘bNext’ có tên truyền tham số Phương thức ‘init()’ kiểm tra tham số có tên ‘mybutton’ Sau đó, tạo nút với chuổi tên nút Nếu tham số truyền vào, nút có tên mặc định ‘Default’ Bây định nghĩa thẻ đoạn mã HTML sau: /* */ Chương trình 6.3 import java.awt.*; import java.applet.*; /* */ public class Mybutton1 extends Applet { Button bNext; public void init() { /*getParameter returns the value of the specified pareameter in the form of a String object*/ String str = getParameter("mybutton"); //when no parameter is passed if (str==null) str = new String ("Default"); //when parameter is passed bNext = new Button(str); add (bNext); } } Chương 6: Applets 155 Sau kết chương trình trên: Hình 6.5: truyền tham số cho applet Bây sử dụng lớp Graphics để vẽ hình chẳng hạn như: đường thẳng, hình oval, hình chữ nhật Chúng ta học lớp Font phần sau Lớp dùng để hiển thị văn font 6.5 Lớp Graphics Java cung cấp gói AWT cho phép ta vẽ hình đồ hoạ Lớp Graphics bao gồm tập hợp nhiều phương thức Nhưng phương thức sử dụng để vẽ hình hình sau: Oval Rectangle Square Circle Lines Text Bạn vẽ hình màu Canvas môi trường để hiển thị đồ hoạ Frame, Applet Để vẽ hình ảnh cần phải có đồ hoạ (Graphical Background) Để có đồ hoạ, goi phương thức ‘getGraphics()’ hay phương thức phương thức sau đây: repaint() Được gọi cần vẽ lại đối tượng vẽ update(Graphics g) Được gọi cách tự động phương thức ‘repaint()’ Phương thức xoá đối tượng vẽ, truyền cho đối tượng lớp Graphics để gọi phương thức ‘paint()’; paint(Graphics g) Được gọi phương thức update() Đối tượng truyền cho phương thức dùng để vẽ Phương thức 156 Core Java dùng để vẽ hình ảnh đồ hoạ khác Việc gọi phương thức paint() lặp lặp lại thông qua phương thức repaint() xoá hình vẽ trước Để vẽ hình mà giữ lại hình vẽ trước đó, cần override lại phương thức update() public void update (Graphics g) { paint (g); } Ở đây, phương thức update() không xoá đối tượng vẽ, gọi phương thức paint() Để làm điều này, truyền đối tương lớp Graphics GraphicsContext cho phương thức paint() Ở đây, đối tượng lớp Graphics ‘g’ 6.5.1 Vẽ chuỗi, ký tự byte Chương trình sau minh hoạ vẽ chuỗi, ký tự byte Để vẽ in chuỗi, lớp Graphics cung cấp phương thức ‘drawString()’ Cú pháp sau: drawString (String str, int xCoor, int yCoor); Ba tham số là: Chuỗi cần vẽ Toạ độ X frame, nơi chuỗi cần vẽ Toạ độ Y frame, nơi chuỗi cần vẽ Để vẽ xuất ký tự frame, lớp Graphics cung cấp phương thức ‘drawChars’ Cú pháp sau: drawChars (char array[], int offset, int length, int xCoor, int yCoor); Chú thích tham số: Mảng ký tự Vị trí bắt đầu, nới ký tự vẽ Số ký tự cần vẽ Toạ độ X, nơi ký tự cần vẽ Toạ độ Y, nơi ký tự cần vẽ Lớp Graphics cung cấp phương thức ‘drawBytes()’ để vẽ in byte frame Cú pháp phương thức sau: drawBytes (byte array[], int offset, int length, int xCoor, int yCoor); tham số phương thức là: Mảng byte Chương 6: Applets 157 Vị trí offset hay vị trí bắt đầu Số byte cần vẽ Toạ độ X Toạ độ Y Đối với ký tự mảng byte, in phần mảng mà Ở đây, toạ độ x y toạ độ tính theo dòng Chương trình 6.4 minh hoạ cách vẽ chuỗi, ký tự byte Chương trình 6.4 import java.awt.*; public class DrawStrings extends Frame { public DrawStrings() { super ("Draw strings, characters, bytes"); setSize (300, 300); setVisible (true); } public void paint(Graphics g) { g.drawString ("Good Morning", 50, 50); g.drawString ("Good Afternoon", 50, 75); g.drawString ("Good Night", 50, 100); char ch[] = {'a','b','c','d','e','f'}; g.drawChars(ch,2,4,50,125); byte b[] = {100,101,102,103,104,105,106,107}; g.drawBytes(b,1,6,50,150); } public static void main (String args[]) { new DrawStrings(); } } Chương trình vẽ chuỗi, ký tự từ mảng ký tự, vẽ byte từ mảng byte Bạn phải import gói java.awt để sử dụng đối tượng đồ hoạ có sẳn gói Ta phải làm điều lớp Graphics nằm gói Sau kết chương trình trên: 158 Core Java Đối với hình oval rộng, giá trị chiều rộng lớn chiều cao, ngược lại hình oval cao Phương thức ‘fillOval()’ nhận thông số, tô hình oval Sử dụng phương thức setColor để đặt màu tô g.setColor(Color.cyan); Ở đây, hình oval tô với màu cyan Lớp Color cung cấp màu khác mà hệ thống có hổ trợ 6.5.3 Vẽ hình chữ nhật (Rectangle) hình chữ nhật bo góc (Rounded Rectangle) Sau cú pháp phương thức dùng để vẽ hình chữ nhật 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, int archeight); Phương thức ‘drawRect()’ dùng để vẽ hình chữ nhật đơn giản Phương thức nhận tham số sau: Toạ độ X góc bên trái Toạ độ Y góc bên trái Chiều rộng hình chữ nhật Chiều cao hình chữ nhật Phương thức vẽ hình chữ nhật có chiều rộng chiều cao cho trước, bắt đầu toạ độ X, Y Chúng ta thiết lập màu hình chữ nhật Ở đây, chọn màu đỏ Câu lệnh sau: g.setColor (Color.red); Phương thức ‘drawRoundRect()’ vẽ hình chữ nhật có góc tròn Phương thức nhận tham số, tham số đầu giống với phương thức drawRect Hai tham số khác là: arcwidth hình chữ nhật archeight hình chữ nhật Ở đây, ‘arcwidth’ làm tròn góc trái góc phải hình chữ nhật ‘archeight’ làm tròn góc đỉnh góc đáy hình chữ nhật Ví dụ, arcwidth = 20 có nghĩa hình chữ nhật làm tròn cạnh trái cạnh phải cạnh 10 160 Core Java pixel Tương tự, archeight = 40 tạo hình chữ nhật làm tròn từ đỉnh đến đáy 20 pixel Pìxel đơn vị đo Nó đơn vị nhỏ vùng vẽ Để tô hay vẽ hình chữ nhật hình chữ nhật bo góc, sử dụng phương thức ‘fillRect()’ ‘fillRoundRect()’ Những phương thức nhận tham số giống với phương thức drawRect() drawRoundRect() Những phương thức vẽ hình ảnh với màu cho trước màu hành Lệnh sau dùng để vẽ hình với màu xanh: g.setColor(Color.green); 6.5.4 Vẽ hình chữ nhật 3D vẽ hình cung (Arc) Sau cú pháp phương thức dùng để vẽ hình chữ nhật 3D hình cung: draw3Drect (int xCoord, int yCoord, int width, int height, boolean raised); drawArc(int xCoord, int yCoord, int width, int height, int arcwidth, int archeight); fillArc(int xCoord, int yCoord, int width, int height, int arcwidth, int archeight); Phương thức ‘draw3Drect()’ nhận tham số tham số đầu tương tự với phương thức để vẽ hình chữ nhật Tuy nhiên, giá trị tham số thứ định hình chữ này có chiều hay không Tham số thứ có kiểu liệu boolean Giá trị True có nghĩa hình chữ nhật 3D Phương thức ‘drawArc()’ nhận tham số sau: Toạ độ x Toạ độ y Chiều rộng cung vẽ Chiều cao cung vẽ Góc bắt đầu Độ rộng cung (góc cung) so với góc ban đầu Phương thức ‘fillArc()’ nhận tham số giống phương thức drawArc(), vẽ cung tô cung với màu thời 6.5.5 Vẽ hình PolyLine Chương trình sau lấy điểm từ hai mảng để vẽ loạt đường thẳng Cú pháp phương thức sau: drawPolyline (int xArray[], int yArray[], int totalPoints); Chương 6: Applets 161 g.setFont (new Font(“Times Roman”, Font.BOLD, 15)); Phương thức ‘drawPolyline()’ nhận tham số sau: Mảng lưu trữ toạ độ x điểm Mảng lưu trữ toạ độ y điểm Tổng số điểm cần vẽ Để vẽ đường thẳng ta lấy điểm từ hai mảng sau: (array1[0], array2[0]) (array1[1], array2[1]) (array1[2], array2[2])… Số đường thẳng vẽ nhỏ số truyền vào thông số thứ phương thức drawPolyline() Ví dụ như: totalPoints - Chương trình 6.5 minh hoạ vẽ polyline Chương trình 6.5 import java.awt.*; class PolyLines extends Frame { int x1[] = {50, 75, 95, 115, 135}; int y1[] = {50, 30, 60, 75, 60}; int x2[] = {67, 82, 95, 120, 135}; int y2[] = {150, 130, 160, 155, 180}; public PolyLines()//constructor { super ("Poly Lines"); setSize (300, 300); setVisible (true); } public void paint (Graphics g) { g.drawPolyline (x1, y1, 5); g.setFont (new Font("Times Roman", Font.BOLD, 15)); g.drawString("Current Color is black", 100, 100); g.setColor(Color.blue); g.drawPolyline (x2, y2, 5); g.drawString ("Current Color is blue", 100, 200); } public static void main (String args[]) { new PolyLines(); } } Kết chương trình minh hoạ hình 6.7 162 Core Java Hình 6.7 6.5.6 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 nhận đối tượng lớp Polygon Phương thức thức lấy hai mảng điểm, tổng số điểm cần vẽ Chúng ta sử dụng phương thức để vẽ đa giác Cú pháp drawPolygon() sau: drawPolygon(int x[], int y[], int numPoints); Cú pháp fillPolygon() sau: fillPolygon (int x[], int y[], int numPoints); Chương trình lấy điểm từ mảng để vẽ đa gíac Phương thức ‘drawPolygon()’ nhận tham số sau giống phương thức drawPolyline() Mảng lưu trữ toạ độ x điểm Mảng lưu trữ toạ độ y điểm Tổng số điểm cần vẽ Chương trình 6.6 import java.awt.*; class PolyFigures extends Frame { int x1[] = {50, 25, 40, 100, 80}; int x2[] = {80, 30, 50, 150, 100, 170}; int y1[] = {50, 70, 120, 120, 80}; int y2[] = {150, 170, 200, 220, 240,190}; public PolyFigures() { super ("Poly figures"); Chương 6: Applets 163 setSize(300, 300); setVisible (true); } public void paint (Graphics g) { g.drawPolygon (x1, y1, 5); g.setColor (Color.cyan); g.fillPolygon (x2, y2, 6); } public static void main (String args[]) { new PolyFigures(); } } Sau kết chương trình trên: Hình 6.8 Polygon 6.6 Điều khiển màu Trong Java, điều khiển màu cách dùng màu đỏ (red), xanh (green), xanh dương (blue) Java sử dụng mô hình màu RGB Đối tượng lớp Color chứa số nguyên cho tham số red, green, blue Bảng sau trình bày giá trị có màu đó: Thành phần Red Green Blue Bảng 6.2 Phạm vi giá trị Phạmvi 0-255 0-255 0-255 thành phần màu Sử dụng giá trị để tạo màu tuỳ thích Cú pháp hàm dựng để tạo màu sau: 164 Core Java color (int red, int green, int blue); Bảng sau hiển thị giá trị màu thường gặp: Màu Re Gree Blue d n White 255 255 255 Light Gray 192 192 192 Gray 128 128 128 Dark Gray 64 64 64 Black 0 Pink 255 175 175 Orange 255 200 Yellow 255 255 Magenta 255 255 Bảng 6.3 Các giá trị RGB Các đối tượng màu khác tạo giá trị Những đối dùng để vẽ tô đối tượng đồ hoạ Ví dụ, để tạo màu hồng, ta dùng lệnh sau: color c = new Color (255, 175, 175); Ta thiết lập màu cách dùng lệnh sau: g.setColor (c); //g đối tượng lớp Graphics Sử dụng kết hợp giá trị RGB để tạo màu tuỳ ý Để cho dể hơn, lớp Color cung cấp sẳn số màu color.white color.black color.orange color.gray color.lightgray color.darkgray color.red color.green color.blue color.pink color.cyan color.magenta color.yellow Bảng 6.4 Các màu thường gặp Đoạn mã sau minh hoạ cách tạo màu tuỳ ý: Color color1 = new Color (230, 140, 60); Color color4 = new Color (90, 210, 130); g.setColor (color1); int myred = color1.getRed (); int mygreen = color1.getGreen (); int myblue = color1.getBlue(); color1 = color1.darker(); color4 = color4.brighter(); Chương 6: Applets 165 6.7 Điều khiển Font Java cung cấp lớp Font gói java.awt cho phép sử dụng loại font khác Lớp bao gồm số phương thức Để sử dụng font, nên kiểm tra xem hệ thống có hổ trợ hay không Phương thức’getAllFont()’ trả tất font mà hệ thống hổ trợ Trước tiên, khai báo đối tượng lớp GraphicsEnvironment sau: GraphicsEnvironment ge; ge = GraphicsEnvironment.getLocalGraphicsEnvironment (); Đối tượng sử dụng cú pháp sau để lấy tất font có mảng Font: Font f[] = ge.getAllFonts(); Phương thức getAllFont() sử dụng Phương thức getAllFonts() thuộc lớp GraphicsEnvironment Đây lớp trừu tượng, ta khởi tạo lớp để truy cập phương thức getAllFont(), sử dụng phương thức ‘getLoacalGraphicsEnvironment()’ lớp GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment (); Tham chiếu đến lớp gán cho biến ge Biến gọi phương thức getAllFont() Chúng ta sử dụng font khác để hiển thị chuổi khác Phương thức getFont() trả font mặc định dùng để hiển thị chuỗi, chọn font Font defaultFont = g.getFont (); //g đối tượng Graphics g.drawString (“Default Font is ”, 30, 50); Dialog font mặc định hệ thống Để thay đổi font mặc định hệ thống thành font khác, tạo đối tượng lớp Font Phương thức khởi tạo Font có tham số sau: Tên font Ta lấy tên thông qua phương thức getFontList() Kiểu font Ví dụ: Font.BOLD, Font.PLAIN, Font.ITALIC Kích thước font Cú pháp sau minh hoạ thông số trên: Font f1 = new Font (“SansSerif”, Font.ITALIC, 16); g.setFont (f1); Ba tham số truyền là: ‘SanSerif’ – tên font, Font.BOLD – kiểu font, 14 kích thước font Những thông số tạo đối tượng f1 Chúng ta kết hợp kiểu font lại với Hãy xét ví dụ sau: 166 Core Java Font f3 = new Font (“Monospaced”, Font.ITALIC+Font.BOLD, 20); Ở kiểu font f3 vừa đậm, vừa nghiêng 6.8 Lớp FontMetrics Lớp xác định kích thước ký tự khác thuộc loại font khác Xác định kích thước bao gồm chiều cao (height), baseline, descent, leading Điều cần thiết ký tự in chiếm kích thước riêng Bạn cần tính kích thước cần thiết in ký tự để tránh ký tự đè lên Height: chiều cao font Baseline (Dòng sở): xác định sở ký tự (không kể phần thấp ký tự) Ascent: khoảng cách từ đường baseline đến đỉnh ký tự Descent: khoảng từ baseline đề đáy ký tự Leading: khoảng cách chữ Chương trình 6.7 minh hoạ việc sử dụng phương thức khác mà lớp FontMetrics có Trong chương trình này, sử dụng phương thức khác để xem xét chi tiết loại font khác Lớp FontMetric lớp trừu tượng Phương thức getFontMetrics() có tham số đối tượng lớp Font, FontMetrics đôi với font FontMetrics fm = g.getFontMetrics (f1); Lệnh tạo đối tượng fm lớp FontMetrics, với đối tượng f1 Bây giờ, sử dụng fm để lấy chi tiết font Các phương thức getHeight, getAscent(), getDescent(), getLeading() trả chi tiết font Phương thức getFont() lớp FontMetrics trả Font mà gắn với đối tượng lớp FontMetrics Phương thức getName() lớp Font trả tên Font Chương trình 6.7 import java.awt.*; class FontMetricsUse extends Frame { public FontMetricsUse() { super ("Detail of Fonts"); setSize (400, 300); setVisible(true); } public void paint (Graphics g) { Chương 6: Applets 167 Font f1 = new Font ("Times Roman", Font.PLAIN, 22); FontMetrics fm = g.getFontMetrics (f1); String name = fm.getFont().getName(); g.drawString ("Details of Font " + name, 30, 50); g.drawString ("Height: " + String.valueOf (fm.getHeight()), 50, 75); g.drawString ("Ascent: " + String.valueOf (fm.getAscent()), 50, 100); g.drawString ("Descent: " + String.valueOf (fm.getDescent()), 50, 125); g.drawString ("Leading: " + String.valueOf (fm.getLeading()), 50, 150); Font f2 = new Font ("DialogInput", Font.PLAIN, 22); fm = g.getFontMetrics (f2); name = fm.getFont().getName(); g.drawString ("Details of Font " + name, 30, 175); g.drawString ("Height: " + String.valueOf (fm.getHeight()), 50, 200); g.drawString ("Ascent: " + String.valueOf (fm.getAscent()), 50, 225); g.drawString ("Descent: " + String.valueOf (fm.getDescent()), 50, 250); g.drawString ("Leading: " + String.valueOf (fm.getLeading()), 50, 275); } public static void main (String args[]) { new FontMetricsUse (); } } Kết chương trình trên: Hình 6.9 Lớp FontMetrics Chương trình 6.8 minh hoạ cách lớp FontMetrics sử dụng để in đoạn văn nhiều font, nhiều dòng Trong chương trình này, cần in văn nhiều font nhiều dòng Lớp FontMetrics giúp ta xác định khoảng cách cần thiết để in dòng văn cho font Điều thật cần thiết, 168 Core Java dòng thứ in sau dòng thứ Trước tiên in msg1 sử dụng font Monospaced Sau đó, in msg2 sử dụng font DiaglogInput Để làm điều này, cần tính khoảng cách cần thiết để in msg1 Phương thức stringWidth() lớp FontMetrics dùng để tính tổng khoảng cách cần thiết để in msg1 Khi chúng cộng thêm khoảng cách vào biến x, lấy vị trí mà bắt đầu in đoạn văn kế tiếp, msg2 Phương thức setFont() dùng để thiết lập font để in văn Kế đó, in msg1 msg2 dòng khác sử dụng chung font Monospaced Ở đây, cần biết khoảng cách chiều cao font, để in dòng Phương thức getHeight() dùng để làm điều Chương trình 6.8 import java.awt.*; class MultiFontMultiLine extends Frame { public MultiFontMultiLine() { super ("Multiline Text"); setSize (450, 200); setVisible (true); } public void paint (Graphics g) { Font f1 = new Font ("MonoSpaced", Font.BOLD, 18); Font f2 = new Font ("DialogInput", Font.PLAIN, 14); int x = 20; int y = 50; String msg1 = "Java Language"; String msg2 = "A new approach to programming"; FontMetrics fm = g.getFontMetrics(f1); g.setFont(f1); g.drawString (msg1, x, y); x = x + fm.stringWidth(msg1); g.setFont(f2); g.drawString (msg2, x, y); g.setFont(f1); y = 100; x = 20; int height = fm.getHeight(); g.drawString (msg1, x, y); y += height; g.drawString (msg2, x, y); } Chương 6: Applets 169 public static void main (String args[]) { new MultiFontMultiLine (); } } Kết chương trình trên: Hình 6.10 Văn xuất nhiều font, nhiều dòng 6.9 Chọn chế độ (mode) để vẽ Các đối tượng vẽ cách sử dụng mode vẽ Khi đối tượng vẽ, đè lên hình vẽ trước Tương tự, đối tượng vẽ vẽ lại nhiều lần chúng xoá đối tượng vẽ trước Chỉ hiển thị nội dung đối tượng Để làm cho nội dung củ nội dung hiển thị nền, lớp Graphics cung cấp phương thức setXORMode (Color c); Chương trình 6.9 minh hoạ tiện lợi của việc sử dụng phương thức setXORMode() Ở đây, sử dụng phương thức setXORMode() để tô hình đồ hoạ khác nhau, mà không đè lên hình khác Kết là, sử dụng mode XOR hiển nhiên tất hình hiển thị đầy đủ Điều có nghĩa hình không đè lên hình củ Thay vào đó, phần chung hình hiển thị thành màu khác Nhưng không sử dụng mode XOR, hình hoàn toàn che khuất hình trước Chương trình 6.9 import java.awt.*; class PaintMode extends Frame { public PaintMode() { super ("Paint Mode"); setSize (300, 300); setVisible (true); } public void paint (Graphics g) { 170 Core Java g.setPaintMode (); g.setColor (Color.blue); g.fillRect (50,50,40, 30); g.setColor (Color.pink); g.fillOval (70, 65, 30, 60); g.setColor (Color.cyan); g.fillRoundRect (90, 80, 70, 50, 20, 30); g.setColor (Color.blue); g.fillRect (50, 150, 40, 30); g.setXORMode (Color.yellow); g.fillOval (70, 165, 30, 60); g.setXORMode (Color.magenta); g.fillRoundRect (90, 180, 60, 40, 50, 20); } public static void main (String args[]) { new PaintMode(); } } Kết chương trình trên: Hình 6.11 Paint mode Tóm tắt Applet chương trình Java chạy trình duyệt web Một chương trình Java vừa applet, vừa application Lớp Graphics nằm gói AWT, bao gồm phương thức sử dụng để vẽ hình đồ hoạ hình oval, hình chữ nhật, hình vuông, hình tròn, đường thẳng văn Java sử dụng bảng màu RGB Lớp Font gói java.awt cho phép sử dụng nhiều font khác Chương 6: Applets 171 Lớp FontMetrics xác định kích thước ký tự 172 Core Java Kiểm tra tiến Phương thức dùng để tạm dừng applet Phương thức dùng để cập nhật (update) cửa sổ Một chương trình Java vừa applet, vừa application Đúng/Sai Java applet đọc, ghi file máy người sử dụng Đúng/Sai Phương thức dùng để tạo tham chiếu đến đối tượng đồ hoạ (Graphics) Trong java, điều khiển màu sắc thực thông qua hai màu trắng đen Đúng/Sai Phương thức dùng để lấy tất font chữ mà hệ thống hỗ trợ Trong lớp FontMetrics, 'ascent' khoảng cách từ 'baseline' đến đáy ký tự Chương 6: Applets Đúng/Sai 173 Bài tập Viết applet sau: Khi người sử dụng nhập vào ô văn click chuột vào nút 'Check identifier' applet phải kiểm tra xem từ có ô văn có phải từ khoá có java không Ghi chú: Sử dụng font chữ khác cho ô văn bản, nút lệnh nhãn Viết applet sau: Người sử dụng phép nhập vào giá trị màu ô tương ứng Khi click nút 'Draw' biểu đồ dạng đường, bar, pie 174 Core Java ... chương trình Java đơn lẻ vừa application vừa applet Chức applet bỏ qua thực thi application ngược lại Chương trình 6. 2 minh hoạ điều Chương trình 6. 2 import java. applet.Applet; import java. awt.*;... trình, thực thi applet cách sử dụng cú pháp sau: 152 Core Java appletviewer both .java Kết sau: Hình 6. 2 Applet Nếu chạy chương trình application, sử dụng cú pháp sau: java both Kết là: Hình 6. 3... Chương trình 6. 5 minh hoạ vẽ polyline Chương trình 6. 5 import java. awt.*; class PolyLines extends Frame { int x1[] = {50, 75, 95, 115, 135}; int y1[] = {50, 30, 60 , 75, 60 }; int x2[] = {67 , 82,