Chính vì những hạn chế trên, trong đề tài này em không sử dụng việc hiển thị bản đồ bằng cách vẽ các thành phần của bản đồ như đường, điểm mà em đã sử dụng ảnh tĩnh được quét để làm phần
Trang 1MỤC LỤC
LỜI NÓI ĐẦU
DANH SÁCH HÌNH VẼ VÀ BẢNG BIỂU
Chương 1 TÌM HIỂU VỀ J2ME 1
1.1 Giới thiệu J2ME 1
1.1.1 Lịch sử 1
1.1.2 Lý do chọn J2ME 2
1.1.3 Kiến trúc của J2M 2
1.1.4 Sự khác nhau giữa ngôn ngữ Java trên CLDC với Java thông thường 5
1.1.5 Giới thiệu MIDP 9
1.1.6 Môi trường phát triển J2ME 10
1.2 Các thành phần giao diện ở mức cao của ứng dụng MIDP 11
1.2.1 Đối tượng Display, Displayable và Screens 12
1.2.2 Thành phần Form và Items 13
1.2.3 Thành phần List, TextBox, Alert và Ticker 18
1.3 Các thành phần giao diện ở mức thấp của ứng dụng MIDP 20
1.3.1 Các hàm API ở mức thấp 20
1.3.2 Lớp Canvas 21
1.3.3 Lớp Graphics 26
1.3.4 Các hàm API dùng để lập trình game 32
1.4 Xử lý sự kiện 33
1.4.1 Đối tượng Command 33
1.5 Record Management System 34
1.5.1 Persistent Storage Through the Record Store 34
1.5.2 Các vấn đề liên quan đến RMS 36
1.5.3 Các hàm API trong RMS 37
1.5.4 Duyệt Record với RecordEnumeration 38
Trang 21.5.5 Sắp xếp các record với interface RecordComparator 40
1.5.6 Searching with RecordFilter 41
Chương 2 PHÂN TÍCH, THIẾT KẾ ỨNG DỤNG 43
2.1 Khảo sát hiện trạng 43
2.2 Phân tích bài toán 44
2.2.1 Mô tả hoạt động 44
2.2.2 Phân tích và xác định yêu cầu 44
2.3 Thiết kế ứng dụng 45
2.3.1 Lược đồ sử dụng 45
2.3.2 Đặc tả Ucase 46
2.3.3 Các biểu đồ hoạt động 51
2.3.4 Thiết kế các lớp 55
2.4 Sản phẩm 65
KẾT LUẬN 68
CÁC THUẬT NGỮ ĐƯỢC SỬ DỤNG 70
TÀI LIỆU THAM KHẢO 72
Trang 3LỜI NÓI ĐẦU
Có thể nói rằng đề tài về bản đồ giao thông không mới Trong các năm qua, đã
có nhiều người nghiên cứu về đề tài này, sản phẩm ứng dụng trong thực tế cũng
có khá nhiều và được đánh giá khá tốt Tuy nhiên ứng dụng bản đồ giao thông trên điện thoại di động lại chưa có nhiều lắm, hơn nữa các chương trình ứng dụng chủ yếu xây dựng bản đồ cho các thành phố lớn như Hà Nội, thành phố Hồ Chí Minh Còn ứng dụng bản đồ giao thông thành phố Thái Nguyên trên điện thoại
di động gần như là chưa có
Trong thời điểm hiện nay, trên thế giới cũng như tại Việt Nam, thị trường cho điện thoại di động cũng trở nên sôi động hơn bao giờ hết Đó là do thu nhập của người dân ngày càng được nâng cao cùng với nhu cầu trao đổi thông tin ngày càng tăng khiến cho nhu cầu sử dụng các phương tiện thông tin liên lạc cũng tăng theo, trong đó số lượng người dân sử dụng điện thoại di động tăng nhiều nhất Các nhà sản xuất điện thoại di động nắm bắt được nhu cầu này của người dân, đặc biệt là của giới trẻ ưa chuộng những sản phẩm công nghệ cao, và yêu cầu cạnh tranh giữa các hãng sản xuất với nhau nên liên tục tung ra nhiều sản phẩm với nhiều tính năng, cấu hình ngày càng được nâng cao, nhất là trong một vài năm trở lại đây đã xuất hiện dòng điện thoại được xem như là một máy tính xách tay bỏ túi, hơn nữa giá thành mà nhà sản xuất đưa ra ngày càng giảm Chiếc điện thoại di động ngày nay không phải là một món hàng quá xa xỉ và ngày càng có nhiều người sở hữu được phương tiện trao đổi thông tin hữu ích này
Cùng với sự phát triển của thị trường điện thoại di động là sự phát triển mạnh
mẽ của xu hướng lập trình phần mềm ứng dụng cho các thiết bị này Phần mềm cho các điện thoại di động hiện nay rất đa dạng mà chủ yếu là các trò chơi, các chương trình tiện ích như đo lường, từ điển, nghe nhạc, xem phim
Với các lý do trên em đã chọn đề tài “Xây dựng bản đồ Thái Nguyên trên điện thoại di động có hỗ trợ Java” với mục tiêu là xây dựng bản đồ thành phố Thái
Nguyên bằng ngôn ngữ lập trình Java, có thể thực thi trên nhiều điện thoại di động khác nhau Nhờ vào phần mềm này người sử dụng có thể: xem bản đồ, tra cứu tên đường, tên các địa điểm, các công trình công cộng như bệnh viện, trường
Trang 4học, chợ , đặc biệt là giúp người sử dụng có thể xác định lộ trình ngắn nhất để
đi từ địa điểm này tới một địa điểm khác Đây có thể nói là một ứng dụng rất hữu ích, rất thực tế và tiện dụng đối với nhiều người, đặc biệt là các bạn trẻ, và những người bận rộn trong việc đi lại
Nói đến lập trình cho điện thoại di động, tất cả những ai đã và đang dùng điện thoại di động, nhất là những ai đã từng là lập trình viên, thì đều thấy được các trở ngại đó là khả năng xử lý của bộ vi xử lý điện thoại rất yếu và dung lượng của bộ nhớ rất nhỏ Tuy nhiên, với sự phát triển của khoa học công nghệ hiện nay, các hãng sản xuất điện thoại di động đã tung ra thị trường dòng điện thoại có thẻ nhớ,
và nâng cấp bộ nhớ của điện thoại lớn hơn 1GB Song các trở ngại trên vẫn gây khó khăn không nhỏ đến việc tổ chức dữ liệu cho phần mềm, bởi thông tin về bản đồ giao thông là lớn, việc lưu trữ và truy xuất chúng cũng khá phức tạp Thêm vào đó, các thư viện hàm trong ngôn ngữ Java được hỗ trợ cho điện thoại thì bị hạn chế, lược bỏ Chính vì những hạn chế trên, trong đề tài này em không
sử dụng việc hiển thị bản đồ bằng cách vẽ các thành phần của bản đồ như đường, điểm mà em đã sử dụng ảnh tĩnh được quét để làm phần hiển thị của bản đồ Các
dữ liệu của bản đồ được xây dựng và đặt vào file ngoài
Nội dung bài báo cáo này được chia thành 2 chương như sau:
Chương 1: Tìm hiểu về J2ME Chương này nêu kiến thức tổng quan về
J2ME và các phương thức xây dựng cơ bản trong lập trình J2ME
Chương 2: Phân tích, thiết kế bài toán Phân tích các yêu cầu nghiệp vụ,
đặc tả các chi tiết ứng dụng ở mức phân tích, thiết kế Cuối chương là mô tả sản phẩm đã xây dựng được
Kết luận: Đánh giá kết quá đã đạt được, trình bày các ưu điểm khuyết điểm
và hướng phát triển mở rộng cho phần mềm
Các thuật ngữ được sử dụng: Liệt kê và giải thích các thuật ngữ đã được
sử dụng
Em xin chân thành cảm ơn các thầy, cô trong khoa Công nghệ thông tin Trường đại học Thái Nguyên đã tận tình dạy bảo, truyền đạt những kinh nghiệm
Trang 5quý báu của mình cho em trong suốt thời gian học tập tại trường Em xin kính chúc các thầy cô luôn luôn mạnh khỏe và ngày càng thành công hơn nữa
Đặc biệt em xin bày tỏ lòng biết ơn sâu sắc đến cô Phạm Thị Thương, người
đã tận tình hướng dẫn em trong suốt thời gian thực hiện đề tài
Mặc dù em đã cố gắng rất nhiều trong quá trình thực hiện, nhưng chắc chắn đề tài vẫn còn nhiều thiếu sót Em rất mong nhận được nhiều sự góp ý phê bình của các thầy cô, và các bạn
Một lần nữa, em xin chân thành cảm ơn!
Thái Nguyên, tháng 5 năm 2008
Trang 6DANH SÁCH HÌNH VẼ VÀ BẢNG BIỂU DANH SÁCH HÌNH VẼ
Tên
hình
Trang 72.14 Sơ đồ lớp mức thiết kế (các lớp biên) 65
DANH SÁCH BẢNG BIỂU
Trang 82-16 Danh sách các thuộc tính của lớp SettingsForm 64
Trang 9Chương 1
TÌM HIỂU VỀ J2ME
1.1 Giới thiệu J2ME
1.1.1 Lịch sử
Khi Sun Microsystems nhận ra rằng việc tạo ra một nền tảng chung để chạy
trên tất cả các môi trường là điều không thể thực hiện được, công ty đã quyết định chia công nghệ Java của mình thành 3 phiên bản, mỗi phiên bản được ứng dụng trong một lĩnh vực riêng biệt, đó là:
Java 2 Platform, Enterprise Edition (J2EETM) phục vụ cho các nhu cầu về thương mại như phục vụ khách hàng, các nhu cầu về phân phối, các vấn
đề về nhân sự Phiên bản này được chạy trên các máy server
Java 2 Platform, Standard Edition (J2SETM) được cung cấp cho thị trường máy tính để bàn trong các máy tính phục vụ văn phòng hay trong gia đình
Java 2 Platform, Microedition (J2METM) chạy trên các máy với tài nguyên hạn chế
Hình vẽ dưới đây minh họa các phiên bản hiện có của Java và các lĩnh vực ứng dụng của chúng
Hình 1.1 Các phiên bản khác nhau của Java và lĩnh vực ứng dụng
Trang 10J2ME được phát triển từ kiến trúc Java Card, Embeded Java và Personal Java của phiên bản Java 1.1 Đến sự ra đời của Java 2 thì Sun quyết định thay thế Personal Java và được gọi với tên mới là Java 2 Micro Edition, viết tắt là J2ME Đúng với tên gọi, J2ME là nền tảng cho các thiết bị có tính chất nhỏ, gọn
1.1.2 Lý do chọn J2ME
a) Java ban đầu được thiết kế dành cho các máy tính với tài nguyên các bộ nhớ hạn chế
b) Thị trường của J2ME được mở rộng ra cho nhiều chủng loại thiết bị như:
Các loại thẻ cá nhân như Java Card
Máy điện thoại di động
Máy PDA(Personal Digital Assistant - thiết bị trọ giúp cá nhân)
Các hộp điều khiển dành cho ti vi, thiết bị giải trí gia dụng,
1.1.3 Kiến trúc của J2M
Kiến trúc J2ME được thiết kế để có thể hỗ trợ các thiết bị nhúng khác nhau trên thị trường Để làm được như thế, môi trường J2ME cung cấp nhiều loại máy ảo Java (Java Virtual Machine) khác nhau
Với các thiết bị cấp thấp, tài nguyên hạn chế, môi trường J2ME cung cấp một cấu hình máy ảo rất nhỏ và các thư viện Java chỉ gồm các gói lớp cần thiết cho thiết bị
Hình 1.2: Kiến trúc tổng quát của J2ME
Trang 11Giới thiệu các thành phần trong nền tảng J2ME:
Configuration (Cấu hình): là đặc tả định nghĩa một môi trường phần
mềm cho một dòng các thiết bị được phân loại bởi tập hợp các thuộc tính, ví dụ như:
CLDC (Connected Limited Device Configuration - Cấu hình thiết bị kết nối giới hạn): được thiết kế để nhắm vào thị trường các thiết bị cấp thấp (low-end), các thiết bị này thông thường là máy điện thoại di động và PDA với khoảng 512KB bộ nhớ Vì tài nguyên bộ nhớ hạn chế nên CLDC được gắn với Java không dây (Java Wireless), dạng như cho phép người sử dụng mua và tải về các ứng dụng Java, ví dụ như là Midlet
CDC - Connected Device Configuration (Cấu hình thiết bị kết nối): CDC được đưa ra để nhắm tới các thiết bị có tính năng mạnh hơn dòng thiết bị thuộc CLDC nhưng vẫn yếu hơn các hệ thống máy để bàn sử dụng J2SE Những thiết bị này có nhiều bộ nhớ hơn (thông thường là trên 2Mb) và
có bộ xử lý mạnh hơn Các sản phẩm này có thể kể đến như các máy PDA cấp cao, điện thoại web, các thiết bị gia dụng trong gia đình
Cả hai dạng Cấu hình kể trên đều chứa máy ảo Java (Java Virtual Machine) và tập hợp các lớp (class) Java cơ bản để cung cấp một môi trường cho các ứng dụng J2ME Tuy nhiên phải chú ý rằng đối với các thiết bị cấp thấp, do hạn chế
về tài nguyên như bộ nhớ, bộ vi xử lý nên không thể yêu cầu các máy ảo hỗ trợ
Trang 12tất cả các tính năng như với máy ảo của J2SE, ví dụ, các thiết bị thuộc CLDC không có phần cứng yêu cầu các phép tính toán dấu phẩy động, nên máy ảo thuộc CLDC không được yêu cầu hỗ trợ kiều float và double
Bảng dưới là sự so sánh các thông số kĩ thuật của CDC và CLDC
các class khác nhau, nên thường ta không thể chuyển một ứng dụng Java
viết cho một profile này và chạy trên máy hỗ trợ cho một profile khác
Cũng với lí do đó, ta không thể lấy một ứng dụng viết trên J2SE hoặc J2EE
để chạy trên các máy hỗ trợ J2ME Sau đây là các profile tiêu biểu:
Mobile Information Device Profile (MIDP): profile này sẽ bổ sung các
tính năng như hỗ trợ kết nối, các thành phần hỗ trợ giao diện người dùng
vào CLDC Profile này được thiết kế chủ yếu để nhắm vào điện thoại
di động với đặc tính là màn hình hiển thị hạn chế, dung lượng chứa có hạn Do đó MIDP sẽ cung cấp một giao diện người dùng đơn giản và các
tính năng mạng đơn giản dựa trên HTTP Có thể nói MIDP là profile nổi
tiếng nhất bởi vì nó là kiến thức cơ bản cho lập trình Java trên các máy di động
PDA Profile: tương tự MIDP, nhưng với thị trường là các máy PDA với
màn hình và bộ nhớ lớn hơn
Foundation Profile: cho phép mở rộng các tính năng của CDC với phần
lớn các thư viện của bộ Core Java2 1.3
Trang 13Ngoài ra còn có Personal Basis Profile, Personal Profile, RMI Profile, Game Profile
1.1.4 Sự khác nhau giữa ngôn ngữ Java trên CLDC với Java thông thường
Khả năng xử lý số thực:
Các phép toán trên số thực thường cần nhiều thời gian để xử lý Ngoài
ra phần lớn các thiết bị không có phần cứng hỗ trợ cho việc tính toán trên số thực, do đó CLDC không hỗ trợ số thực
Finalization:
Trong các lớp được viết bằng J2SE, chúng ta thường định nghĩa một phương thức là finalize() Phương thức này sẽ được gọi trước khi bộ thu gom rác (garbage collector) thu gom đối tượng Phương thức này là nơi chúng ta đặt các mã lệnh để giải phóng các tài nguyên đã sử dụng Tuy nhiên CLDC không hỗ trợ phương thức finalize()
lý lỗi được vì đã quá trễ
Các lớp kế thừa từ J2SE:
CLDC yêu cầu khoảng 160KB để chạy máy ảo Java và các thư viện cơ bản Do
đó chỉ có một số lớp trong J2SE là được giữ lại:
System Classes
java.lang.Class java.lang.Object java.lang.Runnable (interface)
Trang 14java.lang.Runtime java.lang.String java.lang.StringBuffer java.lang.System java.lang.Thread java.lang.Throwable
Data Type Classes
java.lang.Boolean java.lang.Byte java.lang.Character java.lang.Integer java.lang.Long java.lang.Short
Collection Classes
java.util.Enumeration (interface) java.util.Hashtable
java.util.Stack java.util.Vector
Input/output Classes
java.io.ByteArrayInputStream java.io.ByteArrayOutputStream java.io.DataInput (interface) java.io.DataInputStream java.io.DataOutput (interface) java.io.DataOutputStream java.io.InputStream java.io.InputStreamReader java.io.OutputStream java.io.OutputStreamWriter java.io.PrintStream
Trang 15java.io.Reader java.io.Writer
Calendar and Time Classes
java.util.Calendar java.util.Date java.util.TimeZone
Utility Classes
java.lang.Math java.util.Random
Exception Classes
java.io.EOFException java.io.InterruptedIOException java.io.IOException
java.io.UnsupportedEncodingException java.io.UTFDataFormatException java.lang.ArithmeticException java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayStoreException
java.lang.ClassCastException java.lang.ClassNotFoundException java.lang.Exception
java.lang.IllegalAccessException java.lang.IllegalArgumentException java.lang.IllegalMonitorStateException java.lang.IllegalThreadStateException java.lang.IndexOutOfBoundsException java.lang.InstantiationException
java.lang.InterruptedException java.lang.NegativeArraySizeException java.lang.NullPointerException
Trang 16java.lang.NumberFormatException java.lang.RuntimeException java.lang.SecurityException java.lang.StringIndexOutOfBoundsException java.util.EmptyStackException
java.util.NoSuchElementException
Error Classes
java.lang.Error java.lang.OutOfMemoryError java.lang.VirtualMachineError
Internationalization
java.io.InputStreamReader java.io.OutputStreamWriter
Trang 171.1.5 Giới thiệu MIDP
a) Định nghĩa:
Đây là Profile được định nghĩa dành riêng cho các thiết bị di động và là thành phần chính trong J2ME MIDP cung cấp các chức năng cơ bản cho hầu hết các dòng thiết bị di động phổ biến nhất như các máy điện thoại di động và các máy PDA
b) Yêu cầu phần cứng:
Màn hình có kích thước tối thiểu là 96x54 pixel
Có ít nhất một trong các thiết bị nhập sau: bàn phím, màn hình cảm ứng
Ít nhất 128 KB để chạy các thành phần của MIDP
Ít nhất 8 KB để chạy các ứng dụng để chứa dữ liệu
Ít nhất 32 KB để chạy Java
Kết nối mạng không dây
c) Những chức năng MIDP không thực hiện được:
Phép tính dấu phẩy động (floating point): Phép tính này đòi hỏi rất nhiều tài nguyên CPU và phần lớn các CPU cho các thiết bị di động không hỗ trợ
phép tính này, do đó MIDP cũng không có
Bộ nạp class (Class loader)
Hỗ trợ từ khóa finalize() như trong J2SE: việc “dọn dẹp” tài nguyên trước khi nó bị xóa được đẩy về phía lập trinh viên
d) Những chức năng MIDP cung cấp:
Trang 18 Các lớp và kiểu dữ liệu: Phần lớn các lớp quen thuộc vẫn còn được giữ lại như các lớp trong gói Java.until: Stack, Vector, Hastable, Enumeration
Hỗ trợ đối tượng Display: Đúng như tên gọi một chương trình MIDP sẽ
hỗ trợ duy nhất một đối tượng Display là đối tượng quản lý việc hiển thị
dữ liệu lên màn hình điện thoại
Hỗ trợ Form và các giao diện người dùng
Nâng cấp tính năng bảo mật như:
Download qua mạng an toàn hơn qua việc hỗ trợ giao thức HTTPS
Kiểm soát việc kết nối giữa máy di động và server: ví dụ như các chương trình không thể kết nối tới server nếu thiếu sự chấp thuận của người sử dụng
Thêm các API hỗ trợ Multimedia: Một trong những cải tiến hấp dẫn nhất của MIDP 2.0 là tập các API media của nó Các API này là một tập con chỉ hỗ trợ âm thanh của Mobile Media API (MMAPI)
Mở rộng các tính năng của Form
Hỗ trợ các lập trình viên Game bằng cách tung ra Game API ý tưởng của Game API là việc giả định rằng một màn hình game là tập hợp các layer, điều này sẽ làm giảm đáng kể kích thước file của sản phẩm Ngoài
ra Game API còn cung cấp các tính năng khác như quản lý các thao tác bàn phím
Hỗ trợ kiểu ảnh RGB: một trong những cải tiến hấp dẫn nhất cho các nhà phát triển MIDP là việc biểu diễn hình ảnh dưới dạng mảng các số nguyên, cho phép MIDlet thao tác với dữ liệu hình ảnh một cách trực tiếp
1.1.6 Môi trường phát triển J2ME
Trang 19Có nhiều môi trường phát triển ứng dụng J2ME và mỗi hãng điện thoại cũng đưa ra môi trường phát triển riêng Trong quá trình xây dựng đồ án này
em đã dùng toolkit của Sun: J2ME Wireless Toolkit 2.5.2 để làm môi trường phát triển J2ME, kết hợp với phần mềm Eclipse 3.2 để xây dựng code
Giao diện của chương trình Wireless Toolkit:
Hình 1.3: Giao diện của chương trình Wireless Toolkit 2.5.2
1.2 Các thành phần giao diện ở mức cao của ứng dụng MIDP
Trước hết chúng ta hãy tìm hiểu vòng đời của một MIDlet:
Giống như dạng chương trình Applet trên J2SE, một midlet luôn luôn kế
thừa javax.microedition.midlet Hàm cơ bản nhất trong mọi midlet là startApp(),
hàm này sẽ khởi tạo Midlet cũng như vận hành các thành phần hoặc đối tượng
khác, ngoài startApp(), mỗi Midlet còn có pauseApp() và destroyApp(), mỗi hàm
này sẽ được gọi thực thi tương ứng khi user chọn dừng hoặc thoát chương trình
Trang 20
Hình 1.4: Minh họa vòng đời của một MIDlet 1.2.1 Đối tượng Display, Displayable và Screens
Một đối tượng MIDlet chỉ có một đối tượng thể hiện Display Đối tượng
này dùng để lấy thông tin về đối tượng trình bày, ví dụ màu được hỗ trợ, và bao gồm các phương thức để yêu cầu các đối tượng được trình bày Đối tượng Display cần thiết cho bộ quản lý việc trình bày trên thiết bị điều khiển thành phần nào sẽ được hiển thị lên trên thiết bị
Mặc dù chỉ có một đối tượng Display ứng với mỗi MIDlet, nhưng nhiều đối tượng trong một MIDlet có thể được hiển thị ra trên thiết bị như Forms, TextBoxes, ChoiceGroups,
Một đối tượng Displayable là một thành phần được hiển thị trên một thiết
bị MIDP chứa 2 lớp con của lớp Displayable là Screens và Canvas Hình dưới
đây mô tả mối quan hệ trên:
Trang 21Hình 1.5: Mối quan hệ giữa Display, Displayable, Screen
Một đối tượng Screen không phải là một cái gì đó hiện ra trên thiết bị, mà lớp Screen này sẽ được kế thừa bởi các thành phần hiển thị ở mức cao, chính các
thành phần này sẽ được hiển thị ra trên màn hình
DateField(String label, int mode)
DateField(String label, int mode, TimeZone timeZone)
Các mode tương ứng của lớp DateField bao gồm:
DateField.DATE_TIME: cho phép sửa đổi ngày giờ
DateField.DATE: chỉ cho phép sửa đổi ngày
Trang 22DateField.TIME: chỉ cho phép sửa đổi giờ
Một thành phần Gauge là một kiểu giao diện thường được dùng để mô tả mức
độ hoàn thành một công việc Có 2 loại Gauge: loại tương tác (cho phép người dùng có thể thay đổi Gauge), loại không tương tác (đòi hỏi người phát triển phải cập nhật Gauge)
Hàm dựng của lớp Gauge:
Gauge(String label, boolean interactive, int maxValue, int initialValue)
Trong đó:
label : nhãn của Gauge
interactive: cho biết người dùng có thể thay đổi giá trị hay không Nếu là true cho phép người dùng thay đổi, nếu là false thì không cho phép
maxValue: giá trị lớn nhất của Gauge, hoặc có thể là INDEFINITE ( trong trường hợp non-interactive)
initialValue: giá trị bắt đầu trong khoảng [0 maxValue], nếu maxValue là INDEFINITE thì initialValue sẽ nhận một trong các giá trị:
CONTINUOUS_RUNNING, INCREMENTAL_UPDATING
Ví dụ:
private Gauge gaVolume;
gaVolume = new Gauge (“Volume”, true, 75, 2);
Trang 23int getValue() Trả về giá trị hiện tại của Gauge
boolean isInteractive() Trả về true nếu Gauge là loại tương tác, trả về
false nếu Gauge là loại không tương tác
void setDefaultCommand
(Command cmd)
void setItemCommandListener
(ItemCommandListener it)
void setLabel(String label) Thiết lập nhãn cho Item
void setLayout(int layout)
void setMaxValue(int maxValue)
void setPreferredSize(int width,
int height)
void setValue(int value)
Bảng 1-2: Danh sách một số hàm trong Gauge
c) StringItem
Một thành phần StringItem dùng để hiển thị nhãn hay chuỗi văn bản Người
dùng không thể thay đổi nhãn hay chuỗi văn bản khi chương trình đang chạy
StringItem không nhận ra sự kiện
Phương thức dựng của lớp StringItem:
StringItem(String label, String text)
d) TextField
Một thành phần TextFiel tương tự như bất kì các đối tượng nhập văn bản
tiêu biểu khác Có thể chỉ định một nhãn, số kí tự tối đa và loại dữ liệu được phép nhập
Phương thức dựng của lớp TextField:
Trang 24TextField (String label, String text, int maxSize, int constraints)
Trong đó constraints là thành phần xác định loại dữ liệu nào sẽ được nhập
vào, gồm có:
any - cho phép nhập kí tự bất kì
emailaddr - chỉ cho phép nhập vào các địa chỉ email hợp lệ
numeric - chỉ cho phép nhập số
phonenumber - chỉ cho phép nhập số điện thoại
url - chỉ cho phép nhập các kí tự hợp lệ bên trong URL
password - che tất cả các kí tự nhập vào
Ví dụ:
private TextField tfText;
tfText = new TextField(“Password:”, “”, null, TextField.PASSWORD);
private ChoiceGroup cgChoice;
cgChoice = new ChoiceGroup(“ Lua chon”, Choice.EXCLUSIVE);
cgChoice.append(“Chuc nang 1”, null);
cgChoice.append(“Chuc nang 2”, null);
f) Spacer
Spacer là thành phần không nhìn thấy, được dùng để định vị cho các đối tượng khác trên màn hình hiển thị Có thể dùng Spacer chỉ rõ khoảng trắng
theo chiều dọc và chiều ngang giữa các thành phần bằng cách chỉ ra chiều
rộng và chiều dài cho từng cái Vì Spacer là thành phần không nhìn thấy nên
nó không có sự kiện
Trang 25g) CustomItem
Thành phần CustomItem cho phép các lập trình viên tạo ra những thành phần Item của chính họ Những thành phần này cũng giống như các Item khác,
có thể được đặt vào trong Form và nhận biết xử lý sự kiện
CustomItem được vẽ lên màn hình hiển thị bằng phương thức paint() Vì thế
nó sẽ tùy thuộc vào đoạn mã bên trong phương thức paint() Ví dụ minh họa sườn tạo ra đối tượng CustomItem:
public class NewItem extends CustomItem
Hai lớp được dùng để hiển thị hình ảnh là: Image và ImageItem Image
được dùng để tạo một đối tượng hình ảnh và giữ thông tin như chiều cao,
chiều rộng, và dù ảnh có biến đổi hay không Lớp ImageItem mô tả một ảnh sẽ
được hiển thị như thế nào, ví dụ như tấm ảnh đó sẽ được đặt ở đâu trên màn hình hiển thị: ở trung tâm, hay về phía trái, hay phía dưới
Trang 26MIDP đưa ra hai loại hình ảnh là loại ảnh biến đổi và loại ảnh không biến đổi Một tấm ảnh không biến đổi thì nó không thể bị thay đổi kể từ lúc nó được tạo ra Đặc trưng của loại ảnh này là được đọc từ một tập tin Một tấm ảnh biến đổi về cơ bản nó là một vùng nhớ Điều này tùy thuộc vào việc tạo nội dung tấm ảnh bằng cách ghi nó lên vùng nhớ
Các phương thức dựng cho lớp Image và ImageItem:
Image createImage(String name)
Image createImage(Image source)
Image createImage(byte[] imageDate, int imageOffset, int imageLength) Image createImage(int width, int height)
Image createImage(Image image, int x, int y, int width, int height, int transform)
Image createImage(InputStream stream)
Image createRGBImage(int[] rgb, int width, int height, boolean processAlpha)
ImageItem(String label, Image img, int layout, String altText)
Ví dụ: Mô tả cách tạo một tấm ảnh từ một tập tin, gắn nó với một đối tượng
ImageItem và thêm nó vào một Form:
Form fmMain = new Form(“Images”);
Image im = Image.createImage(“/vidu.png”);
fmMain.append(new ImageItem(null, im, ImageItem.LAYOUT_CENTER, null));
PNG là loại ảnh duy nhất được hỗ trợ bởi bất kì thiết bị MIDP nào
1.2.3 Thành phần List, TextBox, Alert và Ticker
Cây phân cấp trình bày trên một thiết bị hoàn chỉnh;
Trang 27Hình 1.6: Cây phân cấp các lớp hiển thị ở mức cao
a) List
Một List chứa một dãy các lựa chọn thể hiện một trong ba dạng: cho phép
chọn nhiều lựa chọn (multi), chỉ chọn một lựa chọn (exclusive), và dạng không
tường minh (implicit) Các List không tường minh được dùng để thể hiện một
thực đơn các chọn lựa
List.MULTIPLE List.EXCLUSIVE List.IMPLICIT
Hình 1.7: Minh họa các dạng của List b) TextBox
TextBox được dùng để cho phép nhập nhiều dòng Thành phần TextBox và TextField có những ràng buộc giống nhau trong việc chỉ định loại nội dung
được phép nhập vào
Trang 28Phương thức dựng của một TextBox:
TextBox(String title, String text, int maxSize, int constraints)
c) Alert và AlertType
Một Alert đơn giản là một hộp thoại rất nhỏ Có 2 loại Alert:
Modal: là loại hộp thoại thông báo được hiển thị cho đến khi người
có một sự kiện xảy ra, ví dụ như báo khi có lỗi xảy ra Thành phần Alert bao
gồm 5 loại âm thanh định sẵn là: thông báo, xác nhận, báo lỗi, thông báo và
Nếu các hàm API cấp cao cho phép chúng ta tạo ra giao diện cho các ứng dụng theo chuẩn, thì các hàm API cấp thấp cho phép chúng ta có thể thể hiện được ý tưởng của mình
Canvas và Graphics là hai lớp trái tim của các hàm API cấp thấp Canvas là
một khung vẽ cho phép người phát triển có khả năng vẽ lên thiết bị hiển thị cũng
như là việc quản lý sự kiện Còn lớp Graphics cung cấp các phương tiện thật sự
để vẽ như drawString() và drawRoundRect()
Trang 291.3.2 Lớp Canvas
Lớp Canvas cung cấp một khung vẽ cho phép tạo ra giao diện tùy biến
người dùng Một số lượng lớn các phương thức trong lớp này được dùng để xử lý
sự kiện, vẽ ảnh và chuỗi lên thiết bị hiển thị
a) Hệ thống trục tọa độ
Hệ thống tọa độ cho lớp Canvas có tâm tọa độ là điểm trái trên của
thiết bị hiển thị giá trị x tăng dần về phía phải, giá trị y tăng dần khi đi xuống phía dưới Khi vẽ độ dày bút vẽ là một điểm ảnh
Hình 1.8: Hệ tọa độ trên màn hình điện thoại di động
Các phương thức sau đây sẽ xác định chiều rộng và chiều cao của canvas:
int getWidth(): xác định chiều rộng của canvas
int getHeight(): xác định chiều cao của canvas
Chiều rộng và chiều cao của canvas cũng đại diện cho toàn bộ diện tích khung
vẽ có thể trên thiết bị trình bày Nói cách khác, không thể chỉ định kích thước cho canvas, mà phần mềm trên thiết bị MIDP sẽ trả về diện tích lớn nhất có thể đối với một thiết bị cho trước
b) Tạo một đối tượng Canvas
Bước đầu tiên để làm việc với một lớp Canvas là tạo ra một lớp thừa kế
từ lớp Canvas Ví dụ:
class TestCanvas extends Canvas implements CommandListener{
private Command cmdExit;
Trang 30TestCanvas canvas = new TestCanvas(this);
c) Vẽ trên đối tượng Canvas
Phương thức paint của lớp Canvas cho phép vẽ các hình dạng, vẽ ảnh, xuất
chuỗi Ví dụ: xóa màn hình bằng màu trắng:
protected void paint(Graphics g){
// Thiết lập màu nền là màu trắng
g.setColor(255, 255, 255);
// Tô đầy toàn bộ canvas
g.fillRect(0, 0, getWidth(), getHeight());
class TestCanvas extends Canvas implements CommandListener{
private Command cmdExit;
display = Display.getDisplay(this);
Trang 31cmdExit = new Command("Exit", Command.EXIT, 1);
public void commandAction(Command c, Displayable d){
if (c == cmdExit) .}
}
e) Mã phím
Trong trường hợp xử lý các hành động của các phím mềm, một Canvas có
thể truy cập đến 12 mã phím Những mã này được đảm bảo luôn luôn có trên bất kì các thiết bị MIDP nào
KEY_NUM0
KEY_NUM1 KEY_NUM2 KEY_NUM3 KEY_NUM4 KEY_NUM5 KEY_NUM6 KEY_NUM7 KEY_NUM8 KEY_NUM9 KEY_STAR KEY_POUND Các phương thức để xử lý mã phím:
void keyPress(int keyCode)
void keyReleased(int keyCode)
Trang 32void keyRepeated(int keyCode)
g) Xác định các hành động của trò chơi
Dưới đây là đoạn mã mô tả một cách xác định các hành động của trò chơi để
từ đó gọi các phương thức thích hợp dựa trên các hành động xảy ra:
protected void keyPressed(int keyCode){
Trang 33goRight();
break;
} }
Một lựa chọn nữa là có thể tạo một tham chiếu cho mỗi hành động của trò chơi thông qua quá trình khởi tạo giá trị cho các biến
else if (keyCode == keyRight) goRight()
}
h) Sự kiện con trỏ
Phần này sẽ quản lý con trỏ trong một Canvas Những sự kiện này được thiết
kế để làm thuận tiện cho việc tương tác với các thiết bị có dạng con trỏ Một số phương thức được cung cấp nhằm hỗ trợ cho việc xử lý sự kiện con trỏ:
boolean hasPointerEvents()
boolean hasPointerMotionEvents() - trả về giá trị có kiểu boolean nhằm chỉ
rõ rằng thiết bị di động có hỗ trợ khái niệm “nhấp chuột và rê” hay không
void pointerPressed(int x, int y)
void pointerReleased(int x, int y)
void pointer Dragged(int x, int y)
Trang 341.3.3 Lớp Graphics
Chúng ta sử dụng đối tượng Graphics để vẽ lên một đối tượng Canvas
a) Hỗ trợ màu
Một ứng dụng MIDP chỉ có một đối tượng Display Đối tượng này để lấy
thông tin của màn hình hiển thị hiện tại, ví dụ như số màu hỗ trợ và các phương
thức để yêu cầu các đối tượng được hiển thị Đối tượng Display đơn giản là một
quản lý sự hiển thị của thiết bị và điều khiển những gì sẽ được hiển thị ra trên thiết bị
boolean isColor()
int numColors()
Phương thức đầu tiên cho biết thiết bị hiển thị có hỗ trợ màu hay không Nếu
có thì phương thức 2 sẽ được gọi để xác định số lượng màu được hỗ trợ Các phương thức dưới đây để lấy màu và thiết lập màu:
Cách 2: dùng từng tham số riêng biệt để xác định mỗi màu
Khi sử dụng một giá trị để lưu giữ màu, thì màu đỏ sẽ chiếm 8 bit đầu kể từ bên trái, tiếp theo là 8 bit dành cho màu xanh lá cây, sau cùng là màu xanh dương
Ví dụ thiết lập màu chỉ sử dụng một số nguyên:
int red = 0,
Trang 35blue = 255,
green = 128;
g.setColor((red<<16) | (green<<8) | blue);
Xác định màu bằng cách thiết lập giá trị cho 3 tham số:
g.setColor(red, green, blue);
b) Loại nét vẽ
Chúng ta có thể chọn nét khi vẽ đường thẳng, cung và hình chữ nhật trên thiết
bị hiển thị thông qua một số phương thức sau:
int getStrokeStyle()
void setStrokeStyle(int style)
Hai kiểu nét vẽ được định nghĩa trong lớp Graphics là nét chấm và nét liền: g.setStrokeStyle(Graphics.DOTTED);
g.setStrokeStyle(Graphics.SOLID);
c) Vẽ cung
Chúng ta có thể vẽ một cung chỉ có đường bao quanh hoặc được tô đầy bên trong Có thể bắt đầu bằng cách chỉ định chiều bao quanh bên ngoài của một hình hộp chữ nhật tưởng tượng Góc bắt đầu xác định vị trí bắt đầu vẽ cung, với giá trị 0 được xác định tại thời điểm 3 giờ Giá trị dương tính theo chiều ngược chiều kim đồng hồ Góc của cung chỉ ra rằng có bao nhiêu độ được vẽ tính từ góc ban đầu, theo ngược chiều kim đồng hồ
void drawRect(int x, int y, int width, int height)
Trang 36void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)
void fillRect(int x, int y, int width, int height) void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)
Khi vẽ hình chữ nhật có 4 góc là tròn phải xác định đường kính theo chiều
ngang (arcWidth) và đường kính theo chiều dọc (arcHeight) Những tham số
này được định nghĩa độ sắc nét của cung theo mỗi chiều, giá trị càng lớn thể hiện một cung tăng dần, ngược lại là một đường cong hẹp
e) Font chữ
Dưới đây là cách sử dụng font chữ được hỗ trợ bởi giao diện cấp thấp của ứng dụng MIDP Một số phương thức dựng của lớp Font:
Font getFont(int face, int style, int size)
Font getFont(int fontSpecifier)
Các tham số kiểu dáng có thể được kết hợp thông qua toán tử hoặc Ví dụ:
Font font = Font.getFont(Font.FACE_PROPORTIONAL,
Font.STYLE_BOLD | Font.STYLE_ITALIC, Font.SIZE_MEDIUM);
Trang 37Sau khi có một tham chiếu đến một đối tượng Font, ta có thể truy vấn nó để xác định thông tin của các thuộc tính của nó, thông qua các phương thức:
Kích thước của các font chữ được xác định bởi các chiều cao của font chữ,
bề dài tính bằng điểm ảnh của một chuỗi kí tự trong một font xác định Một số
các phương thức sau hỗ trợ khi tương tác với một đối tượng font:
Hình 1.9: Vị trí các điểm neo trong drawString()
Có 6 điểm neo được định nghĩa trước, 3 theo chiều dọc và 3 theo chiều thẳng đứng Khi xác định điểm neo để vẽ chuỗi (các điểm neo thường được sử dụng thành từng cặp), ta phải chọn một điểm hoành độ và một điểm tung độ Các điểm neo được định nghĩa như sau:
Trang 38Chiều ngang
LEFT (Bên trái)
HCENTER (Chính giữa của chiều ngang)
RIGHT (Bên phải)
Hình 1.10: Mô tả kết quả của hàm drawString
Bằng cách thay đổi điểm neo chúng ta có thể thay đổi vị trí của chuỗi được hiển thị
g) Vẽ các chuỗi ký tự
Sau khi tìm hiểu về font và các điểm neo chúng ta có thể vẽ chuỗi ký tự ra màn hình thông qua một số phương thức sau:
void drawChar(char character, int x, int y, int anchor)
void drawChars(char[] data, int offset, int length, int x, int y, int anchor) void drawString(String str, int x, int y, int anchor)
void drawSubstring(String str, int offset, int len, int x, int y, int anchor)
Ví dụ minh họa:
Trang 39// Lấy tâm của vùng hiển thị
int xcenter = getWidth() / 2, ycenter = getHeight() / 2;
// Thiết lập font chữ hiển thị
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_ITALICS,
Font.SIZE_MEDIUM));
// Chỉ định tâm của chuỗi ký tự (hình hộp bao quanh) sử dụng điểm neo
g.drawString("developerWorks", xcenter, ycenter, Graphics.BASELINE |
Graphics.HCENTER);
}
h) Vẽ ảnh
Lớp Graphics cung cấp một phương thức dùng để vẽ ảnh:
drawImage(Image img, int x, int y, int anchor)
Chúng ta cũng áp dụng từng bước khi vẽ ảnh cũng giống như xuất chuỗi ra màn hình Đối với cả 2 chúng ta đều phải bắt đầu bằng việc thiết lập tọa độ x,
y cũng như điểm neo Danh sách các điểm neo cho việc hiển thị ảnh gần giống với việc xuất chuỗi, tuy nhiên có một điểm khác là một bức ảnh có một điểm
trung tâm Vì thế VCENTER được thay thế cho giá trị BASELINE khi làm việc
với ảnh
Chiều ngang
LEFT (Bên trái)
HCENTER (Điểm chính giữa theo chiều ngang)
RIGHT (Bên phải)
Chiều dọc
TOP (điểm trên)
VCENTER (Điểm chính giữa theo chiều dọc)
BOTTOM (Bên dưới)
Trang 40Hình 1.11: Vị trí các điểm neo trong drawImage i) Một số phương thức khác của lớp Graphics
clip() và translate() là 2 phương thức của lớp Graphics Một vùng hiển thị
được cắt xén được định nghĩa là khu vực hiển thị của thiết bị di động, vùng này sẽ được cập nhật trong suốt thao tác vẽ lại Một số phương thức hỗ trợ cho việc xén một vùng hiển thị:
void setClip(int x, int y, int width, int height)
void clipRect(int x, int y, int width, int height)
int getClipX()
int getClipY()
int getClipWidth()
int getClipHeight()
translate() là phương thức được sử dụng có liên quan đến hệ thống trục tọa
độ Chúng ta có thể tịnh tiến đến một tọa độ x, y khác Một số phương thức hỗ
trợ cho việc tịnh tiến hệ trục tọa độ:
void translate(int x, int y)
tảng để tạo giao diện người dùng, nhưng trong trường hợp này chỉ cho việc tạo
game GameCanvas chứa một vùng nhớ tách rời với vùng nhớ màn hình cho