MỤC LỤC
Lời Nói Đầu. 1
Phần 1: Kiến thức nền tảng J2ME. 5
Chương 1: Tổng quan vềJ2ME. 5
1.1 Giới thiệu J2ME (Java 2 Micro Edition).5
1.2 Lý do chúng ta cần J2ME.6
1.3 Các thành phần của J2ME:.7
1.3.1 Configuration:.7
1.3.2 Profile:.9
1.3.3 Máy ảo Java.10
Chương 2: Giới thiệu CLDC và MIDP. 13
2.1. CLDC.13
2.1.1. Yêu cầu phần cứng:.13
2.1.2. Yêu cầu phần mềm:.13
2.1.3. Máy ảo Java:.13
2.2. MIDP:.16
2.2.1. Yêu cầu phần cứng:.16
2.2.2. Yêu cầu phần mềm:.16
2.2.3. Cấu trúc MID Profile:.16
2.2.4. MIDlet Suite:.18
2.2.5. Môi trường phát triển ứng dụng J2ME.22
Chương 3: Các vấn đềcơbản của chương trình MIDlet. 25
3.1. Cấu trúc cơbản:.25
3.2. Xây dựng một ứng dụng MIDlet:.25
3.3. Lớp MIDlet:.26
3.4. Lớp MIDletStateChangeException:.28
3.5. Display.28
3.6. Lớp Displayable:.30
3.7. Quản lý các sựkiện (event).32
3.7.1. Command & CommandListener.33
3.7.2. Item và ItemStateListener.38
Chương 4: Giao diện đồhọa cấp cao. 40
4.1. Screen:.42
4.2. Form:.43
4.3. Item:.45
4.3.1. DateField:.46
4.3.2. Gauge:.48
4.3.3. String Item:.51
4.3.4. TextField:.53
4.3.5. ChoiceGroup:.57
4.3.6. Image và ImageItem:.61
4.4. List:.64
4.5. TextBox:.69
4.6. Alert và AlertType:.72
4.6.1. Alert:.72
4.6.2. AlertType:.74
4.7. Ticker:.77
Chương 5: Giao diện đồhọa cấp thấp. 78
5.1. Canvas:.78
5.1.1. Hệtoạ độ:.79
5.1.2. Vẽtrên đối tượng Canvas:.79
5.1.3. Bắt sựkiện trong các đối tượng Canvas:.82
5.1.4. Game action:.85
5.1.5. Sựkiện con trỏ:.87
5.2. Graphics:.89
5.2.1. Màu sắc:.90
5.2.2. Nét vẽ:.93
5.2.3. Font chữ:.98
5.2.4. Vẽcác đối tượng hình ảnh (image):.101
5.2.5. Các phương thức tịnh tiến đối tượng:.103
5.2.6. Vùng xén (Clipping regions):.105
Chương 6: Lưu trữthông tin với RMS. 106
6.1. Giới thiệu RMS.106
6.2. Duyệt danh sách Record với RecordEnumeration.115
6.3. Sắp xếp bằng RecordComparator.117
6.4. Lọc record với RecordFilter.119
6.5. Nhận thông điệp khi Record Store thay đổi.121
6.6. Xửlý lỗi khi thao tác với Record Store.122
Chương 7: Kết nối mạng với Generic Connection Framework (GCF) 124
7.1. Giới thiệu GFC.124
7.2. Lược đồlớp.124
7.3. Kết nối HTTP:.127
7.3.1. Khởi tạo kết nối:.127
7.3.2. Các đặc điểm của kết nối HTTP bằng J2ME:.130
7.3.3. Thông sốkết nối:.137
7.4. Kết nối socket Datagram (UDP).138
7.5. Kết nối TCP socket.141
7.6. Gửi và nhận SMS.144
Phần 2 : Web Service và Ứng dụng "Đăng Ký Học Phần". 149
Chương 8: Giới thiệu Web Service. 149
8.1. Ứng dụng phân tán (Distributed Application).149
8.1.1. Giới thiệu.149
8.1.2. Các vấn đềnảy sinh trong hệthống ứng dụng phân tán.150
8.1.3. Hạn chếcủa những mô hình ứng dụng phân tán trước đây.151
8.2. Web Service.152
8.2.1. Định nghĩa.152
8.2.2. Thành phần cơbản của Web service:.152
8.2.3. Hoạt động của Web service.152
8.2.4. Ưu điểm của web service.155
8.3. Các thành phần chính của Web Service.157
8.3.1. SOAP (Simple Object Access Protocol).157
8.3.2. WSDL (Web Service Definition Language).162
Chương 9: Ứng dụng đăng ký học phần. 172
9.1 Đặc tảchương trình:.172
9.1.1 Tổng quan:.172
9.1.2 Các chức năng chính:.172
9.2 Kiến trúc chương trình:.174
9.2.1 Mô hình kết nối:.174
9.2.2 Mô hình bảo mật (mã hoá password):.176
9.3 Phân tích - thiết kế:.177
9.3.1 Mô hình use case:.177
9.3.2 Đặc tảmột sốuse case chính:.178
9.4 Thiết kếmô hình dữliệu:.183
9.4.1 Mô hình thực thểkết hợp:.183
9.4.2 Các bảng dữliệu:.183
9.4.3 Chi tiết các bảng dữliệu:.184
9.4.4 Ràng buộc dữliệu:.188
9.4.5 Mô hình dữliệu:.190
9.4.6 Các chức năng store procedures:.190
9.4.7 Thiết kếlớp:.191
9.5 Cài đặt - thửnghiệm:.192
9.5.1 Yêu cầu phần cứng:.192
9.5.2 Yêu cầu phần mềm:.193
9.5.3 Giao diện chương trình:.193
Chương 10: Tổng kết. 205
10.1 Kết luận:.205
10.2 Hướng phát triển:.207
Tài liệu tham khảo. 210
PhụLục A: Hướng dẫn sửdụng công cụSun Wireless ToolKit 2.3. 211
PhụLục B: Xây dựng và Sửdụng Web Service. 217
PhụLục C: Giới thiệu các thưviện JSR. 222
234 trang |
Chia sẻ: netpro | Lượt xem: 1603 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Luận văn Nghiên cứu Java mobile và xây dựng ứng dụng minh hoạ, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
hết hạn.
VD:
Alert alTest = new Alert (“Alert”);
alTest.setTimeout (Alert.FOREVER);
...
display.setCurrent (alTest);
73
Java Mobile
Lớp Alert là lớp con của Screen, Screen là lớp con của Displayable nhưng đối
tượng Alert không được phép gọi trực tiếp một số hàm sau của lớp Displayable:
• addCommand(Command)
• removeCommand(Command)
• setCommandListener(CommandListener)
Điều này nghĩa là đối tượng Alert không được phép gắn thêm nút (đối tượng
Command ) cũng như không xử lý và bắt sự kiện. Đối tượng này chỉ có chức năng
gửi thông báo đến người dùng chứ không thêe nhận phản hồi từ người dùng. Nếu
đối tượng Alert gọi các hàm này thì sẽ bị phát sinh Exception IllegalStateException.
4.6.2. AlertType:
AlertType là lớp định nghĩa sẵn các loại Alert cho thiết bị, hỗ trợ âm thanh tương
ứng khiAlert hiển thị. Gồm năm loại:
• Báo giờ (alarm)
• Nhắc lại (confirmation)
• Báo lỗi (error)
• Thông báo (info)
• Cảnh báo (warning)
Âm thanh của Alert có thể được chơi bằng một trong hai cách:
• Nếu đối tượng Alert được gán loại Alert trước thì âm thanh tương ứng
của loại Alert này sẽ được phát khi đối tượng hiển thị lên màn hình.
VD:
Alert alWarning = new Alert (“Alert”, “Message”, null,
AlertType.WARNING);
hay
Alert alTest =new Alert (“Alert”, “Message”, null, null);
alTest.setType(AlertType.WARNING);
74
Java Mobile
• Phát âm thanh Alert trực tiếp mà không cần tạo một đối tượng Alert
nghĩa là chỉ phát âm thanh thông báo mà không hiển thị lên màn hình,
bằng cách dùng phương thức: AlertType..playSound (Display);
cách này có thể dùng khi chỉ cần báo cho ngưòi dùng biết về sự kiện mà
không cần hiển thị thông tin trực tiếp lên màn hình. Các sự kiện khác
nhau có thể được thông báo bằng các âm thanh khác nhau.
VD: AlertType.CONFIRMATION.playSound(fmMain);
Hay AlertType.ALARM.playSound(fmMain);
Các loại AlertType được định nghĩa trước:
Giá trị Ý nghĩa
ALARM Báo giờ hoặc nhắc nhở
CONFIRMATION Thông báo hoàn tất 1 công việc nào đó
ERROR Báo lỗi
INFO Thông báo chung
WARNING Khuyến cáo
Bảng 4.18 AlertType
Lớp AlertType chỉ hỗ trợ một phương thức duy nhất là
boolean playSound (Display display) để gọi thực hiện chức năng play sound của đối
tượng AlertType.
VD:
//tạo một đối tượng Alert có kèm hình ảnh và âm thanh dạng thông báo khi hiển thị
Image img = Image.createImage(“/coffee.png”);
Alert alAlert= new Alert (“Hello”, “It’s time for coffee”, img, AlertType.INFO);
//gán kiểu Modal Alert
alAlert.setTimeout(Alert.FOREVER);
….
75
Java Mobile
//gọi hiển thị Alert
display.setCurrent(alAlert, fmMain);
Hình 4.12 Giao diện đối tượng Alert
76
Java Mobile
4.7. Ticker:
Ticker là lớp hỗ trợ hiển thị chuỗi ký tự cuộn liên tục trên màn hình. Đối tượng
Ticker có thể được gắn vào bất kỳ đối tượng Screen nào, kể cả Alert. Vị trí chuỗi ký
tự ở trên hay dưới màn hình, cũng như tốc độ cuộn phụ thuộc vào đặc tả MIDP.
Các phương thức và chức năng tương ứng của lớp Ticker:
Lớp Ticker: javax.microedition.lcdui.Ticker
Phương thức Chức năng
Ticker (String strText) Tạo một đối tượng Ticker với nội dung
chuỗi cuộn strText cho trước
String getString () Lấy chuỗi ký tự của Ticker
void setString (String strText) Gán chuỗi ký tự cho Ticker
Bảng 4.19 Lớp Ticker
VD:
//tạo đối tượng Ticker
Ticker tkMessage = new Ticker (“Wellcome to J2ME, have a nice day!!!”);
//gắn vào form
fmMain.setTicker(tkMessage);
Hình 4.13 Giao diện Ticker
77
Java Mobile
Chương 5: Giao diện đồ họa cấp thấp
Đồ hoạ cấp thấp trong J2ME được hỗ trợ chủ yếu qua hai lớp chính là Canvas và
Graphics.
Lớp Canvas có dạng một phông có kích thước cố định và những gì vẽ lên phông
này sẽ được hiển thị cho người dùng. Lớp Canvas cũng hỗ trợ các phương thức bắt
sự kiện ở cấp thấp
Lớp Graphics cung cấp những đối tượng để vẽ lên Canvas (hay được gọi là
những ngữ cảnh đồ họa (graphics context)). Lớp Graphics hỗ trợ vẽ các đối tượng
đường thẳng, đừơng tròn, hình chữ nhật, text… cũng như các phương thức chọn
màu và font chữ.
5.1. Canvas:
Canvas là lớp con của lớp Displayable (ngang cấp với lớp Screen), nghĩa là
có thể gắn thêm các đối tượng Command vào Canvas để bắt sự kiện như Form. Khi
sử dụng, không tạo trực tiếp một đối tượng Canvas mà xây dựng một lớp kế thừa
lớp này và xử lý các chức năng đồ hoạ của chương trình bên trong lớp con này.
VD:
class MyFirstCanvas extends Canvas implements CommandListener{
…
Command cmdExit =new Command(“Exit”, Command.EXIT, 1);
addCommand(cmdExit);
setCommandListener(this);
…
}
MyFirstCanvas mfcCanvas = new MyFisrtCanvas(this);
display.setCurrent(mfcCanvas);
78
Java Mobile
5.1.1. Hệ toạ độ:
Tương tự hệ toạ độ trong lập trình Windows, gốc toạ độ (0,0) nằm ở góc trái trên
của màn hình. Tung độ y tăng dần theo chiều dọc từ trên xuống, hoành độ x tăng
dần theo chiều từ trái sang phải. Độ dày mặc định của các đối tượng đồ hoạ trong
J2ME là 1 pixel.
Đối tượng Canvas đặc trưng bởi 2 giá trị là chiều dài và chiều rộng. Hai giá trị này
là cố định cho các đối tượng Canvas khác nhau đựơc tạo lập trong cùng một thiết bị
và phụ thuộc vào loại thiết bị di động.
Các phương thức của lớp Canvas để truy vấn các giá trị này:
Lớp Canvas: javax.microedition.lcdui.Canvas
Phương thức Chức năng
int getWidth () Lấy giá trị độ rộng đối tượng Canvas
int getHeight () Lấy giá trị độ dài đối tượng Canvas
Bảng 5.1 Truy vấn kích thước Canvas
5.1.2. Vẽ trên đối tượng Canvas:
Canvas và Screen là hai lớp con của lớp Displayable nên cùng kế thừa phương thức
abstract paint() của lớp cha. Trong khi phương thức paint() trong lớp Screen và các
lớp con của nó đã được dựng sẵn để vẽ các đối tượng đồ hoạ cấp cao(title, ticker,
form, textbox, list, alert…) lên màn hình thì trong lớp Canvas, phương thức này vẫn
được khai báo với từ khoá abstract, nghĩa là phải viết xử lý cho phương thức này ở
lớp con của Canvas (lớp kế thừa mà ta xây dựng để vẽ lên màn hình).
abstract public class Displayable {
abstract void paint(Graphics g);
}
79
Java Mobile
public abstract class Canvas extends Displayable {
protected abstract void paint(Graphics g);
}
public abstract class Screen extends Displayable {
abstract void paintContent(Graphics g);
paint(Graphics g){
// gắn tiêu đề
//gắn đối tượng Ticker
…
paintContent(g);
}
}
public class Form extends Screen {
void paintContent(Graphics g){… }
}
public class TextBox extends Screen {
void paintContent(Graphics g) {… }
}
public class List extends Screen implements Choice {
void paintContent(Graphics g){… }
}
public class Alert extends Screen{
void paintContent(Graphics g){… }
}
80
Java Mobile
Các phương thức hỗ trợ vẽ của lớp Canvas:
Lớp Canvas: javax.microedition.lcdui.Canvas
Phương thức Chức năng
abstract void paint (Graphic g) vẽ đối tượng g lên Canvas
final void repaint () yêu cấu vẽ Canvas
final void repaint (int x, int y, int
width, int height)
yêu cấu vẽ một vùng của Canvas ((x,y) là
toạ độ góc trái trên; width, height là kích
thước vùng cần vẽ lại)
final void serviceRepaints() xử lý các yêu cầu vẽ còn treo
boolean isDoubleBuffered () kiểm tra thiết bị có hỗ trợ hai buffer không
Bảng 5.2 Lớp Canvas
Phương thức paint() được dùng để xử lý các sự kiện vẽ trong đối tượng Canvas.
Nhưng khi cần yêu cầu thiết bị vẽ lại màn hình thì không gọi trực tiếp phương thức
này mà gọi phương thức repaint(). Phương thức repaint() này sẽ gọi hàm paint() để
vẽ lại toàn bộ hay một phần màn hình.
Phương thức serviceRepaint() yêu cầu tất cả các yêu cầu vẽ trước đó phải được thực
hiện ngay. Do đó, khi gọi phương thức này các tiến trình khác sẽ bị block cho đến
khi tất cả các phương thức vẽ được thực hiện.
Các phương thức hỗ trợ giao tiếp với Application Manager:
Lớp Canvas: javax.microedition.lcdui.Canvas
Phương thức Chức năng
void showNotify () Được gọi trước khi application manager vẽ
đối tượng canvas lên màn hình
void hideNotify () Được gọi sau khi application manager xoá
đối tượng canvas khỏi màn hình
Bảng 5.3 Giao tiếp với Application Manager
Các phương thức này đựơc khai báo trong lớp Canvas với kiểu protected
81
Java Mobile
protected void showNotify(){ };
protected void hideNotify(){ };
và được gọi bởi application manager trước khi vẽ và sau khi xoá đối tượng canvas
lên màn hình. Do đó, không gọi trực tiếp các phương thức này trong chương trình.
Mà chỉ nên viết code trong các phương thức này để cấp phát, khởi tạo các biến cũng
như tạo lập hay hủy các tiến trình xử lý cho việc vẽ các đối tượng lên Canvas.
5.1.3. Bắt sự kiện trong các đối tượng Canvas:
Đối tượng canvas có thể hỗ trợ bắt sự kiện dưới hai cấp độ:
• bắt sự kiện cấp cao: thêm một hay nhiều đối tượng Command vào đối
tượng Canvas và bắt sự kiện thông qua các Command này (dùng
CommandListener)
• bắt sự kiện cấp thấp: bắt sự kiện các phím số trên thiết bị cũng như các sự
kiện con trỏ, sự kiện trong game…
5.1.3.1 Bắt sự kiện cấp cao:
Lớp Canvas cũng là lớp con của Displayable như lớp Screen do đó cũng kế thừa các
phương thức hỗ trợ Command như lớp Screen, gồm:
• addCommand(Command)
• isShown()
• removeCommand(Command)
• setCommandListener(CommandListener)
VD:
class TestCanvas extends Canvas implements CommandListener {
private Command cmExit; // Exit MIDlet
...
cmExit = new Command("Exit", Command.EXIT, 1);
addCommand(cmExit);
setCommandListener(this);
82
Java Mobile
...
public void commandAction(Command c, Displayable d) {
if (c == cmExit) {...}
}
}
5.1.3.2 Bắt sự kiện cấp thấp:
Sử dụng mã phím(key code)
Mã phím là các giá trị nguyên gán cho các phím tương ứng trong thiết bị di động.
Các mã phím này được gán với các tên tương ứng cho dễ nhớ như:
public static final int KEY_NUM0 = 48;
public static final int KEY_NUM1 = 49;
…
Bảng mã phím các phím bàn phím ITU-T (0-9, *, #)
Lớp Canvas: javax.microedition.lcdui.Canvas
Tên Giá trị
KEY_NUM0 48
KEY_NUM1 49
KEY_NUM2 50
KEY_NUM3 51
KEY_NUM4 52
KEY_NUM5 53
KEY_NUM6 54
KEY_NUM7 55
KEY_NUM8 56
KEY_NUM9 57
KEY_STAR 42
KEY_POUND 35
Bảng 5.4 Mã Phím
83
Java Mobile
Lớp Canvas hỗ trợ việc bắt sự kiện các phím này bằng các phương thức:
Lớp Canvas: javax.microedition.lcdui.Canvas
Phương thức Chức năng
void keyPressed (int keyCode) được gọi khi người dùng nhấn phím
void keyReleased (int keyCode) được gọi khi người dùng nhả phím
void keyRepeated (int keyCode) được gọi khi người dùng nhấn 1 phím nhiều
lần (một số thiết bị không hỗ trợ phương thức
này)
boolean hasRepeatEvents () kiểm tra thiết bị có hỗ trợ nhấn 1 phím nhiếu
lần không
String getKeyName () lấy tên phím tương ứng của mã phím
Bảng 5.5 Sự kiện keyPressed
Các phương thức keyPressed(), keyReleased() và keyRepeated() được khai báo
trong lớp Canvas với thuộc tính protected.
protected void keyPressed (int keyCode){ };
protected void keyReleased (int keyCode){ };
protected void keyRepeated (int keyCode){ };
Do đó, muốn bắt sự kiện nào thì ta chỉ cần khai báo phương thức tương ứng trong
lớp kế thừa Canvas và viết code xử lý cho phương thức đó.
Vd:
protected void keyPressed(int keyCode) {
switch (keyCode) {
KEY_NUM1: …
break;
KEY_NUM2: …
break;
…
}
}
84
Java Mobile
5.1.4. Game action:
MIDP cũng hỗ trợ lập trình game bằng cách định nghĩ sẵn một bộ các phím bấm xử
lý sự kiện game. Mỗi sự kiện game cũng được gán bởi một số nguyên như sự kiện
phím bấm. Các sự kiện chính bao gồm các sự kiện sang trái, sang phải, lên, xuống
và bắn. Với các loại điện thoại có hỗ trợ các phím di chuyển thì các sự kiện này sẽ
được gán trực tiếp cho các phím đó. Nếu không, có thể gán các sự kiện này với các
phím số 2, 4, 6, 8, 5.
Lớp Canvas:
javax.microedition.lcdui.Canvas
Tên sự kiện Mô tả Giá
trị
UP di chuyển lên trên 1
DOWN di chuyển xuống dưới 6
LEFT di chuyển sang trái 2
RIGHT di chuyển sang phải 5
FIRE bắn 8
GAME_A Tuỳ chọn 9
GAME_B Tuỳ chọn 10
GAME_C Tuỳ chọn 11
GAME_D Tuỳ chọn 12
Bảng 5.6 Sự kiện Game Action
85
Java Mobile
Các phương thức sử dụng cho lập trình game:
Lớp Canvas: javax.microedition.lcdui.Canvas
Phương thức Chức năng
int getKeyCode
(int gameAction)
lấy mã phím tương ứng với hành động game
int getGameAction
(int keyCode)
xác định hành động game tương ứng với mã phím cho trước
Bảng 5.7 Bắt sự kiện trong Game Action
VD:
//lấy mã phím tương ứng cho các hành động trong game:
int keyFire = getKeyCode(FIRE);
int keyRight = getKeyCode(RIGHT);
…
//lấy loại hành động game để xử lý
protected void keyRepeated (int keyCode) {
switch (getGameAction (keyCode)) {
case Canvas.FIRE: …
break;
case Canvas.LEFT:…
break;
}
}
Một hành động game có thể gán cho nhiều phím bấm, chẳng hạn gán cho cả phím
chức năng (trái, phải, lên, xuống) lẫn các phím số. Khi đó, người dùng có thể bấm
phím chức năng sang trái hay phím số 4 đều phát sinh sự kiện game LEFT như
nhau.
86
Java Mobile
5.1.5. Sự kiện con trỏ:
MIDP cũng hỗ trợ các phương thức để lập trình trên thiết bị di động có sử
dụng con trỏ như chuột hay màn hình cảm ứng.
Lớp Canvas: javax.microedition.lcdui.Canvas
Phương thức Chức năng
boolean hasPointerEvents() kiểm tra thiết bị có hỗ trợ con trỏ không
boolean hasPointerMotionEvents() kiểm tra thiết bị có khả năng nhận các
chuyển động của con trỏ không
void pointerDragged(int x, int y) được gọi khi người dùng rê con trỏ,
(x,y) là toạ độ con trỏ.
void pointerPressed(int x, int y) được gọi khi người dùng nhấn nút con
trỏ
void pointerReleased(int x, int y) được gọi khi người dùng nhả con trỏ
Bảng 5.8 Sự kiện con trỏ
Các sự kiện con trỏ cũng được xử lý tương tự các sự kiện phím bấm. Nếu thiết bị có
hỗ trợ xử lý sự kiện con trỏ, các phương thức pointerDragged(), pointerPressed(),
pointerReleased() sẽ được gọi khi người dùng rê, nhấn nút hay nhả con trỏ. Các
phương thức pointerDragged(), pointerPressed(), pointerReleased() cũng được khai
báo trong lớp Canvas với thuộc tính protected nên nếu muốn xử lý sự kiện con trỏ
cho chương trình phải khai báo hàm với tên tương ứng trong lớp con của chương
trình và viết xử lý bên trong
VD:
protected void pointerPressed(int x, int y) {
// xác định vị trí điểm đầu
startx = x;
starty = y;
}
protected void pointerDragged(int x, int y) {
// xác định vị trí điểm hiện tại
87
Java Mobile
currentx = x;
currenty = y;
repaint();
}
protected void pointerReleased (int x, int y) {
//xác định vị trí điểm cuối
endx = x;
endy = y;
repaint();
}
88
Java Mobile
5.2. Graphics:
Đối tượng Graphics dùng để vẽ lên màn hình Canvas. Lớp Graphics cung cấp sẵn
trên 30 phương thức hỗ trợ vẽ các đối tượng hình học cơ bản (đường thẳng, đường
tròn, hình chữ nhật…), text, cũng như điều khiển màu sắc, phông chữ…
Có thể sử dụng lớp Graphics trong hai trường hợp:
• Trong phương thức paint() của lớp Canvas:
protected void paint(Graphics g){
…
}
đối tượng Graphics này chỉ có giá trị bên trong phương thức paint(),
ra khỏi phương thức này thì không còn dùng để vẽ lên Canvas được
nữa.
• Trong các đối tượng mutable image:
Các immutable image thường được tạo từ file hay resource, có tính
cố định, không thay đổi. Do đó, người ta thường dùng immutable
image làm biểu tượng cho các thành phần trong ChoiceGroup, Form,
List hay Alert.
Ngược lại, đối tượng mutable image chỉ là một vùng nhớ có kích
thước cố định được cấp khi khởi tạo.
VD: Image iImage=Image.createImage(80,20);
Graphics gGraphics=iImage.getGraphics();
Đối tượng Graphics được tạo theo cách này có giá trị cùng với đối
tượng Image. Khi đối tượng Image bị huỷ thì đối tượng Graphics
tương ứng cũng bi huỷ theo.
89
Java Mobile
Các phương thức và chức năng của lớp Graphics:
Lớp Graphics: javax.microedition.lcdui.Canvas
Phương thức Chức năng
void setColor (int RGB) Gán giá trị màu sắc, kết hợp các giá trị 3
màu cơ bản (đỏ, lục, xanh dương) trong
một số nguyên
void setColor (int red, int green,
int blue)
Gán giá trị màu sắc theo các thành phần
riêng biệt
int getColor () Lấy giá trị màu
int getBlueComponent() Lấy giá trị thành phần màu xanh dương
trong đối tượng
int getGreenComponent() Lấy giá trị thành phần màu xanh lục trong
đối tượng
int getRedComponent() Lấy giá trị thành phần màu đỏ trong đối
tượng
void setGrayScale (int value) Gán giá trị grayscale
int getGrayScale () Lấy giá trị grayscale hiện tại
int getStrokeStyle () Lấy kiểu nét vẽ
void setStrokeStyle (int style) Gán kiểu nét vẽ, style có thề mang 1 trong
2 giá trị Graphics.DOTTED hay
Graphics.SOLID
Bảng 5.9 Lớp Graphics
(Grayscale là một số nguyên kiểu int có giá trị từ 0 đến 255 biểu thị độ sáng của
màu xám (shade of gray) )
5.2.1. Màu sắc:
Màu sắc trong đối tượng Graphics được tạo từ 3 màu cơ bản là đỏ, xanh lục và xanh
dương(RGB) được biểu diễn bởi 24 bit màu, mỗi màu chiếm 8 bit. Nếu thiết bị
không hỗ trợ hiển thị màu hay chỉ hỗ trợ với số màu ít hơn thì thiết bị sẽ tự chuyển
90
Java Mobile
đổi để hiển thị ra màu gần nhất so với yêu cầu. Grayscale dùng để hiển thị các sắc
độ màu khác nhau trên màn hình trắng đen.
Khi gán màu cho đối tượng Graphics, có thể dùng một trong 2 cách:
• Kết hợp 3 màu (đỏ, xanh dương và xanh lục) trong một số nguyên
kiểu int hay biểu diễn từng thành phần trong từng số int. Khi kết hợp 3
màu với nhau, mỗi màu được biểu diễn bởi 8 bit và xếp theo thứ tự từ cao
xuống thấp là đỏ, xanh lục và xanh dương.
R R R R R R R R G G G G G G G G B B B B B B B B
RED GREEN BLUE
Do đó, để kết hợp 3 giá trị màu này vào một số nguyên kiểu int, ta phải dịch
bit để có kết quả chính xác. Giá trị màu đỏ sẽ dịch trái 16bits, giá trị màu
xanh lục dịch trái 8 bits và giá trị màu xanh dương chiếm 8 bit thấp nhất.
VD:
int red=0; 0 0 0 0 0 0 0 0
int reen=127; 0 1 1 1 1 1 1 1
int blue=255; 1 1 1 1 1 1 1 1
int color=(red<<16) | (green<<8) | blue;
0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
RED GREEN BLUE
g.setColor(color); //g là đối tượng kiểu Graphics
//Gán giá trị cho từng màu cơ bản riêng biệt:
int red=0;
int green=127;
int blue=255;
g.setcolor(red, green, blue);
91
Java Mobile
Tương tự, khi lấy giá trị màu, ta cũng có thể lấy ra dưới dạng kết hợp hay từng màu
riêng biệt. Nếu lấy giá trị màu dưới dạng kết hợp, để có được giá trị màu cho từng
màu cơ bản cần phải bỏ đi các bit không thích hợp.
Vd:
int color, red, green, blue;
color= g.getColor(); //g là đối tượng kiểu Graphics
red=(color & 0xFF0000)>>16;
green=(color & 0xFF00)>>8;
blue=color & 0xFF;
Có thể kiểm tra thiết bị di động có màn hình màu không bằng phương thức:
javax.microedition.lcdui.Display.isColor().
Ngoài ra có thể lấy số màu thiết bị có hỗ trợ bằng phương thức
javax.microedition.lcdui.Display.numColors().
, nếu thiết bị chỉ có màn hình trắng đen thì giá trị trả về là giá trị grayscale mặc
định.
92
Java Mobile
5.2.2. Nét vẽ:
Kiểu nét vẽ (stroke style): Khi vẽ đường thẳng, đường tròn, hay hình chữ nhật, ta
có thể lựa chọn kiểu nét vẽ là nét liền (Graphics.SOLID) hay cách khoảng
(Graphics.DOTTED). Nét liền là giá trị mặc định của các kiểu vẽ.
Các phương thức vẽ:
Lớp Graphics: javax.microedition.lcdui.Canvas
Phương thức Chức năng
void drawLine (int x1, int y1, int x2,
int y2)
Vẽ đường thẳng từ điểm (x1, y1) đến
điểm (x2, y2)
void drawArc (int x, int y, int width,
int height, int startAngle, int acrAngle)
vẽ đường cong góc arcAngle bắt đầu từ
góc startAngle nội tiếp hình chữ nhật xác
định bởi góc trái trên (x,y) và chiều dài
hai cạnh width, height
void fillArc (int x, int y, int width, int
height, int startAngle, int acrAngle)
vẽ đường cong góc arcAngle bắt đầu từ
góc startAngle nội tiếp hình chữ nhật xác
định bởi góc trái trên (x,y) và chiều dài
hai cạnh width, height và tô màu bên
trong đường cong vừa vẽ.
void drawRect (int x, int y, int width,
int height)
vẽ hình chữ nhật với góc trái trên (x,y) và
chiều dài hai cạnh width, height
void drawRoundRect (int x, int y, int
width, int height, int arcW, int arcH)
vẽ hình chữ nhật với các góc tròn. arcW
và arcH là kích thước của hình chữ nhật
ngoại tiếp góc cong
void fillRect (int x, int y, int width, int
height)
tô hình chữ nhật
void fillRoundRect (int x, int y, int
width, int height, int arcW, int arcH)
tô hình chữ nhật góc tròn
Bảng 5.10 Các phương thức vẽ
93
Java Mobile
VD:
g.drawArc(5, 5, 75, 75, 0, 225);
g.drawArc(80, 70, 75, 100, 90, 225);
g.fillArc(5, 5, 75, 100, 0, 360);
g.fillArc(75, 100, 75, 50, 90, 300);
Hình 5.1 Các phương thức vẽ đường cong
Hình chữ nhật gồm 4 loại:
• Hình chữ nhật thường, không tô
• Hình chữ nhật góc cong, không tô
• Hình chữ nhật thường, tô đặc
• Hình chữ nhật góc tròn, tô đặc
Hình chữ nhật góc tròn là hình chữ nhật trong đó các góc được vẽ theo dạng đường
cong chứ không phải là góc vuông như hình chữ nhật thông thường. Trong đó các
góc cong là ¼ đường cong nội tiếp hình chữ nhật kích thước rộng dài tương ứng là
arcW và arcH.
VD:
94
Java Mobile
g.drawRect(1, 1, 60, 40);
g.drawRoundRect(70, 50, 60, 40, 30, 40);
g.fillRect(1, 1, 60, 40);
g.fillRoundRect(70, 50, 60, 40, 30, 40);
Hình 5.2 Các phương thức vẽ hình chữ nhật
Các phương thức hỗ trợ vẽ text :
Lớp Graphics: javax.microedition.lcdui.Graphics
Phương thức Chức năng
void drawChar (char character, int x,
int y, int anchor)
vẽ ký tự character lên màn hình
void drawChars (char[] data, int
offset, int length, int x, int y, int
anchor)
vẽ chuỗi ký tự data với chiều dài length
từ vị trí offset lên màn hình
void drawString (String str, int x, int
y, int anchor)
vẽ chuỗi str lên màn hình
95
Java Mobile
void drawSubstring (String str, int
offset, int len, int x, int y, int anchor)
vẽ chuỗi con có chiều dài len , từ vị trí
offset của chuỗi str lên màn hình
Font getFont() lấy đối tượng Font hiện tại
void setFont () gán Font cho đối tượng Graphics
Bảng 5.11 Xử lý Text
Khi vẽ text lên màn hình, bất kể đó là một ký tự hay một chuỗi ký tự, ta phải
cung cấp đủ ba tham số: x, y và anchor. Trong đó, (x, y) là toạ độ điểm gốc, và
anchor là vị trí tương đối của điểm gốc so với đoạn text sẽ được hiển thị. Các vị trí
tương đối của anchor đã được định nghĩa sẵn trong lớp Graphics, gồm:
Lớp Graphics: javax.microedition.lcdui.Graphics
Tên anchor Mô tả Vị trí
LEFT lề trái của ký tự / chuỗi chiều ngang
HCENTER điểm giữa của ký tự / chuỗi chiều ngang
RIGHT lề phải của ký tự / chuỗi chiều ngang
TOP điểm cao nhất của ký tự / chuỗi chiều dọc
BASELINE dòng chuẩn của ký tự / chuỗi chiều dọc
BOTTOM điểm cao nhất của ký tự/ chuổi chiều dọc
Bảng 5.12 Giá trị Anchor
Khi sử dụng, biến anchor thường được kết hợp bởi hai kiểu định vị theo chiều
ngang và chiều dọc để được vị trí tương đối của điểm gốc.
VD:
//vẽ chuỗi “Hello J2ME” với góc trái trên trùng góc trái trên của
màn hình
g.drawString (str, 0, 0, Graphics.TOP|
Graphics.LEFT);
//vẽ chuỗi “Hello J2ME” ngay giữa màn hình, nghĩa là điểm
giữa trùng với điểm giữa của màn hình
g.drawString (str, getWidth()/2, getHeight()/2,
Graphics.BASELINE| Graphics.HCENTER );
96
Java Mobile
//vẽ chuỗi “Hello J2ME” với phải dưới trên trùng góc phải dưới
của màn hình
g.drawString (str, getWidth(), getHeight(),
Graphics.BOTTOM | Graphics.RIGHT);
Hình 5.3 Các phương thức hỗ trợ vẽ Text
Hình 5.4 Các định dạng trong Text Graphic
97
Java Mobile
5.2.3. Font chữ:
Lớp Font:
Lớp Font: javax.microedition.lcdui.Font
Phương thức Chức năng
static Font getFont (int face,
int style, int size)
tạo đối tượng Font
static Font getDefaultFont () tạo đối tượng Font mặc định
int getFace () lấy face hiện tại
int getStyle () lấy kiểu chữ (đậm, in nghiêng, gạch dưới)
int getSize () lấy cỡ chữ
boolean isPlain () kiểm tra có đang dùng kiểu chữ thường không
boolean isBold () kiểm tra có đang dùng kiểu chữ đậm không
boolean isItalic () kiểm tra có đang dùng kiểu chữ in nghiêng
không
boolean isUnderlined () kiểm tra có đang dùng kiểu chữ gạch dưới
không
int getHeight () lấy kích thước font (khoảng cách giữa 2 dòng
chữ)
int getBaselinePosition () lấy độ cao chữ
int charWidth (char ch) lấy độ rộng của ký tự ch
int charsWidth (char[] ch, int
offset, int length)
lấy độ rộng của chuỗi ký tự ch dạng mảng char
int stringWidth (String str) lấy độ rộng chuỗi ký tự ch dạng String
int substringWidth (String
str, int offset, int length)
lấy độ rộng chuỗi con của chuỗi ký tự ch dạng
String bắt đầu từ vị trí offset với độ dài length
Bảng 5.13 Xử lý Font chữ
98
Java Mobile
Lớp Font không có phương thức khởi tạo nghĩa là không cần “new” để tạo đối
tượng mới, thay vào đó, ta
Các file đính kèm theo tài liệu này:
- Nghiên cứu java mobile và xây dựng ứng dụng minh hoạ.pdf