Ta định nghĩa Command là một đối tượng giữ thông tin về một sự kiện (Event). Nói một cách đơn giản nhất thì command như một nút ấn (button) trên ứng dụng di
Java Mobile
Hình 3.1 Command Exit
Trong ví dụ trên ta thấy Command “Exit” tương ứng với một nút ấn trên điện thoại. Việc xem một Command tương ứng với một nút ấn trên thiết bị là một quan niệm nhằm đơn giản hóa vấn đề nhưng không hoàn toàn chính xác. Nếu chúng ta xem xét các hạn chế về kích thước về màn hình và số lượng nút ấn có trên thiết bị
thì vấn đề sẽ trở nên phức tạp hơn, có những form số lượng command có thể nhiều hơn số nút ấn chức năng trên thiết bị, lúc này các command được tổ chức theo dạng menu. Trước tiên, ta sẽ tìm hiểu các công việc phải làm để thêm một command vào
ứng dụng:
• Tạo một command để lưu giữ thông tin về event
• Thêm command này vào Form, TextBox hay Alert… (các đối tượng displayable)
• Thêm một listener vào các Form hay TextBox … trên.
Khi phát hiện một event được kích hoạt, bộ listener sẽ gọi hàm commandListener() và truyền các thông tin về event làm thông số cho hàm. Sau đây là một đoạn code ví dụ:
public class TestCommand extends MIDlet implements CommandListener
Java Mobile
private Form fmMain; // Tạo một form
private Command cmExit; // Tạo một command để thoát khỏi ứng dụng ...
fmMain = new Form("Core J2ME"); // Khởi tạo form
cmExit = new Command("Exit", Command.EXIT, 1); // Khởi tạo command ...
fmMain.addCommand(cmExit); // Thêm command vào form fmMain.setCommandListener(this); // Thêm bộ listener cho form ...
//hàm dùng để bắt các sự kiện
public void commandAction(Command c, Displayable s)
{
if (c == cmExit)//nếu là command exit, thoát chương trình { destroyApp(true); notifyDestroyed(); } } }
Qua ví dụ trên ta thấy việc tạo một command và xử lý nó tương đối đơn giản.
Điểm quan trọng cần chú ý là lớp ứng dụng của ta phải cài đặt một bộ listener (trong ví dụ trên ta implements CommandListener) và phải cung cấp hàm commandListener để xử lý các events.
Java Mobile
Label: Đoạn văn bản được xem như nhãn của command. Như trong hình 3.1, “Exit” là nhãn của command. Như trong hình 3.2, ta thấy đây cũng là label của command nhưng được thể hiện ở dạng khác: dạng menu.
Hình 3.2 Command Label
Type: Thật thuận tiện nếu ta có thể ánh xạ một command với một nút trên thiết bị
(ta gọi là “soft-button”). Giả sử ta có một command tên help và ánh xạ được với HELP Button trên thiết bị thì thật trực quan và dễ dàng cho người dùng.
Thông số Type giúp chúng ta làm chuyện này: Ta chọn Command.HELP. Nếu thiết bị không có nút help, thông số này không có ý nghĩa và command được đối xử như
các command thông thường. Tuy nhiên, ta cần lưu ý khi ta tặt type là Command.HELP thì không có nghĩa khi ta chọn command này các hướng dẫn sẽ được phát sinh mà ta cần phải làm việc này trong hàm commandAction(). Thông số
type chỉ giúp việc ánh xạ các nút soft-button được dễ dàng.
Java Mobile
Các type được hỗ trợ:
Giá trị Mô tả
BACK Dùng đểđi ngược lại màn hình trước đó. CANCEL Dùng để hủy công việc đang thực hiện EXIT Dùng để thoát chương trình
HELP Cung cấp thông tin trợ giúp
ITEM Dùng để ánh xạ một Command với một item trên màn hình. Giả
sử khi ta dùng giao diện List, khi chọn một item ta có thể gắn item này với một command để phát sinh một sự kiện nào đó.
OK Xác nhận một yêu cầu nào đó hoặc thoát khỏi màn hình thông báo.
SCREEN Thông thường thiết bị không có các soft button tương ứng với các command dạng này. Việc thể hiện các command sẽ tùy vào từng thiết bị (sẽ có các ví dụ)
STOP Dừng một công việc đang thực hiện.
Bảng 3.4 Các Command Type
Như đã đề cập, các type chỉ có ý nghĩa khi thiết bị có một nút tương ứng dành riêng cho type này (như nút help của thiết bị hình 3.3).
Priority: Độưu tiên, dùng để sắp xếp các command từ trên xuống dưới hay trái sang phải khi được thể hiện chung dạng menu. Hình 3.2 thể hiện command Upload có độ ưu tiên cao hơn command Download. Giá trị này càng cao thì độưu tiên càng thấp. Sau đây là các hàm chính của lớp Command và CommandListener (hai lớp này nằm trong package javax.microedition.lcdui).
Lớp javax.microedition.lcdui.Command
Cú pháp Ý nghĩa
Command (String label, int cmdType, int priority)
Hàm khởi tạo, các thông số đã được trình bày bên trên
Java Mobile
int getLabel() Cho biết Label của Command
int getPriority() Cho biết độ ưu tiên
Lớp javax.microedition.lcdui.CommandListener void commandAction(Command
c, Displayable d)
Được gọi khi command c nằm trên đối tượng Displayable d phát sinh một sự kiện
Bảng 3.5 Command và CommandListener 3.7.2. Item và ItemStateListener
Sự kiện (event) không chỉ được phát sinh thông qua kích hoạt commands mà còn có thểđược phát sinh thông qua các items. Một item là một bộ phận có thể gắn kèm lên trên các form. ChoiceGroup, DateField, Gauge và TextField là các dạng khác nhau của Item và mỗi dạng đều có thể phát sinh các sự kiện (chúng ta sẽ tìm hiểu về các items này trong phần Đồ Họa Cấp Cao). Items chỉ có thểđược sử dụng như một thành phần của form, khác với Commands có thể được sử dụng trong Form, TextBox, List và Canvas.
Khi chúng ta thêm một Item vào Form, để xử lý được các sự kiện phát sinh ta phải cài đặt một Listener (ởđây là ItemStateListener). Khi có một thay đổi trên Item (ví dụ như ta chọn một mục trong ChoiceGroup hay thay đổi dữ liệu của một DateField) thì đối tượng listener sẽ được thông báo có một sự kiện phát sinh cùng các thông tin về sự kiện này. Sự kiện này sẽ kích hoạt hàm itemStateChanged()
được chúng ta cài đặt.
Hiện tại MIDP hỗ trợ các loại Items sau: ChoiceGroup, DateField, Gauge, ImageItem, StringItem và TextField. Ởđây có một ngoại lệ là hai loại StringItem và ImageItem không hỗ trợ phát sinh sự kiện mặc dù chúng là lớp con của lớp Item. Chúng ta cài đặt một listener trong lớp Form, khi một Item phát sinh sẽ kích hoạt hàm itemStateChanged(), tuy nhiên không phải khi chúng ta thay đổi giá trị nhiều items cùng lúc thì itemStateChanged() sẽđược gọi đủ bấy nhiêu lần. Ở đây có một luật được đề ra:
Java Mobile
• Nếu một Item bị thay đổi, hàm itemStateChanged() phải được gọi đối với Item này trước khi những thay đổi trên những Item sau đó được nhận biết.
• Nếu chính bản thân MIDlet thay đổi giá trị một Item (giả sử chúng ta dùng mã lệnh để thay đổi chứ không phải do người dùng), hàm itemStateChanged() không được gọi.
• Nếu thiết bị nhận biết được người dùng chuyển từ Item này sang Item khác (chuyển focus) thì hàm itemStateChanged() phải được gọi trước khi chuyển sang Item kế tiếp.
Sau đây là các hàm quan trọng khi sử dụng Item:
Lớp javax.microedition.lcdui.Item
Cú pháp Ý nghĩa
String getLabel() Lấy nhãn của Item void setLabel(String label) Đặt nhãn cho label Lớp javax.microedition.lcdui.ItemStateListener
void itemStateChanged(Item item) Được gọi khi giá trị item thay đổi
Java Mobile
Chương 4: Giao diện đồ họa cấp cao
MIDP hỗ trợ thiết kế giao diện dưới hai cấp độ:
• Giao diện cấp cao (high-level interfaces): chủ yếu dùng cho các chương trình ứng dụng. Ở cấp độ này, MIDP cung cấp sẵn các thành phần giao diện thường dùng (như textbox, choicegroup, alert...) và hỗ trợ việc hiển thị các thành phần giao diện này lên màn hình thiết bị. Người viết chương trình chỉ cần gọi các phương thức hiển thị đã được cung cấp mà không cần quan tâm đến các phương thức đồ
hoạđã được sử dụng bên dưới.
• Giao diện cấp thấp (low-level interfaces): chủ yếu sử dụng trong các chương trình games. Các lớp đồ hoạở cấp độ này cung cấp các phương thức vẽ trực tiếp các đối tượng đồ hoạ (nhưđiểm, đường thẳng, đường tròn...)lên màn hình và bắt sự kiện phím bấm.
Tất cả các lớp hỗ trợ đồ hoạđược đóng gói trong package javax.microedition.cldui. Trong đó, lớp Screen và các lớp kế thừa từ nó là các thành phần giao diện cấp cao; lớp Canvas thuộc phần giao diện cấp thấp.
Java Mobile
public class Display
public abstract class Displayable
public abstract class Screen extends Displayable public abstract class TextBox extends Screen public abstract class List extends Screen public abstract class Item
public class ChoiceGroup extends Item implements Choice public class DateField extends Item
public class TextField extends Item public class Gauge extends Item public class ImageItem extends Item public class StringItem extends Item
pubilc abstract class Canvas extends Displayable public class Command
public class Ticker public class Graphics public interface Choice
Java Mobile
4.1. Screen:
Lớp Screen không được sử dụng trực tiếp như một đối tượng trong chương trình mà các lớp con của nó (Textbox, List, Alert, Form) mới là các thành phần hiển thị
trên màn hình. Tại một thời điểm chỉ có duy nhất một đối tượng thuộc một trong các lớp này hiển thị trên màn hình. Đây là điểm khác biệt khi so sánh với các lớp con của lớp Item sau này.
Lớp Screen cũng định nghĩa sẵn một đối tượng Ticker kết buộc với nó. Đối tượng này thể hiện một chuỗi ký tự tựđộng cuộn liên tục từ phải sang trái màn hình. Các phương thức và chức năng tương ứng của lớp Screen:
Lớp Screen: javax.microedition.lcdui.Screen
Phương thức Chức năng
String getTitle () Lấy tiêu đề của Screen void setTitle (String s) Gán tiêu đề cho Screen Ticker getTicker () Lấy biến Ticker của Screen void setTicker (Ticker ticker) Gán biến Ticker cho Screen
Java Mobile
4.2. Form:
Form là lớp thông dụng nhất trong các đối tượng Displayable. Nếu khi sử dụng Texbox, List, Alert, ta chỉ có thể hiển thị một đối tượng duy nhất tại một thời điểm thì khi sử dụng Form, chúng ta có thể hiển thị nhiều đối tượng có chức năng tương tự tại cùng một thời điểm. Để làm được điều này, ta chỉ cần tạo một đối tượng thuộc lớp Form và gắn vào đối tượng này một hay nhiều đối tượng thuộc lớp con của lớp Item (TextField, DateField, ChoiceGroup, Gauge, ImageItem, StringItem). Lớp Form cũng hỗ trợ sẵn chức năng cuộn màn hình nếu thiết bị không hiển thị hết tất cả
các Item trong một màn hình.
Lớp Form hỗ trợ sẵn các phương thức thêm, xoá, sửa các thành phần trong Form một cách dễ dàng. Khi gắn một đối tượng thành phần - một đối tượng thuộc lớp con của Item - vào Form, ta sẽ nhận được một giá trị trả về tương ứng với chỉ mục của thành phần đó trong Form. Với chỉ mục này, ta có thể tham chiếu đến thành phần này khi cần tra cứu hay thay đổi thông tin đối tượng.
Các phương thức và chức năng tương ứng của lớp Form:
Lớp Form: javax.microedition.lcdui.Form
Phương thức Chức năng
Form (String title) Khởi tạo một Form
Form (String title, Item[] items) Khởi tạo một Form và thêm các Item vào Form
int append (Image image) Thêm một biến Image vào Form int append (Item item) Thêm một biến Item vào Form int append (String string) Thêm một biến String vào Form void delete (int itemNum) Xoá một Item khi biết chỉ mục của nó void insert (int itemNum, Item item) Chèn một Item vào vị trí chỉ mục cho trước Item getItem (int ItemNum) Lấy một biến Item khi biết chỉ mục của nó void set (int itemNum, Item item) Thay biến Item ở chỉ mục cho trước bằng
Java Mobile
void setItemStateListener(
ItemStateListener iListener)
Thêm biến Listener vào Form
int size () Lấy số Item trong Form
Java Mobile
4.3. Item:
Một Item là một thành phần có thể thêm vào Form. Các lớp con của Item gồm: ChoiceGroup, DateField, TextField, Gauge, ImageItem và StringItem.
Item thường được dùng chung với lớp ItemStateListener. Khi muốn bắt sự kiện của 1 Item, ta chỉ cần kết buộc Item đó với 1 biến listener thuộc lớp ItemStateListener. Biến listener này sẽ lắng nghe các sự kiện và tự gọi phương thức itemStateChanged() khi Item kết buộc với nó có sự thay đổi. Trong phương thức này, ta có thể viết xử lý cho các sự kiện cần bắt của Item.
Vd: tạo 1 DateField cho Form và gắn biến listener để bắt sự kiện: private Form fmMain;
private DateField fdToday; ...
fmMain = new Form (“Core J2ME”);
dfToday = new DateField (“Today: ”, DateField.DATE); ...
public void itemStateChanged(Item item) { if (item == dfToday)
//xử lý
}
Các phương thức và chức năng tương ứng của lớp Item:
Lớp Item: javax.microedition.lcdui.Item
Phương thức Chức năng
String getLabel () Lấy nhãn của Item void setLabel (String label) Gán nhãn cho Item
Java Mobile
4.3.1. DateField:
Dùng để hiển thị một đối tượng ngày giờ (java.util.Date) và cho phép người dùng thay đổi giá trị ngày giờ này bằng các phím bấm của thiết bị di động. Giao diện DateField dễ dùng, khi tạo mới một đối tượng DateField, ta có thể lựa chọn cho phép người dùng chỉ thay đổi giá trị ngày tháng, giờ phút hay cả hai :
Hình 4.2 Giao diện đối tượng DateField
Các phương thức và chức năng tương ứng của lớp DateField:
Lớp DateField: javax.microedition.lcdui.Date
Phương thức Chức năng
DateField (String label, int mode) Khởi tạo một đối tượng DateField
DateField (String label, int mode, TimeZone timeZone)
Khởi tạo một đối tượng DateField với múi giờ cho trước
Date getDate () Lấy giá trị ngày tháng của đối tượng void setDate (Date date) Gán giá trị ngày tháng của đối tượng int getInputMode () Lấy thông tin kiểu nhập liệu
void setInputMode () Gán kiểu nhập liệu
Bảng 4.4 Lớp DateField
Có thể chọn 1 trong 3 kiểu nhập liệu cho đối tượng DateField:
• DATE: chỉ cho phép người dùng thay đổi giá trị ngày tháng
Java Mobile
• DATE_TIME: cho phép người dùng thay đổi giá trị cả ngày tháng lẫn giờ phút
VD:
//tạo 1 biến DateField cho phép người dùng nhập ngày tháng
DateField dfDate = new DateField(“Ngay thang”,DateField.DATE);
//gán ngày tháng hiện thời cho biến dfDate
dfDate.setDate(new Date());
//cho phép người dùng thay đổi thông tin ngày tháng và giờ phút
dfDate.setInputMode(DateField.DATE_TIME);
....
//lấy thông tin ngày tháng của biến dfDate (thường để lấy giá trị mới mà người dùng vừa nhập )
Date dNewDate=new Date;