Quản lý việc hiển thị

Một phần của tài liệu LẬP TRÌNH ỨNG DỤNG MOBILE BẰNG JAVA (Trang 37 - 44)

4.1.1.1. Lớp Display.

Lớp này đảm nhiệm việc cung cấp giao diện cho người dùng nhập dữ liệu vào và nhu cầu xuất dữ liệu ra màn hình. Các đặt trưng của lớp Display:

 Lớp này nằm trong package javax.microedition.lcdui, lớp này chứa hầu hết như tất cả các lớp phục vụ cho việc phát triển giao diện của ứng dụng.

 Một MIDLet sẽ có một và chỉ một đối tượng Display để điều khiển việc thể

hiện dữ liệu.

 Đối tượng Display không có phương thức khởi tạo mà được khởi tạo trực tiếp từ phương thức static của lớp.

Ví dụ: Display display = Display.getDisplay(this);

Tham số đầu vào là một MIDlet, ở đây chúng ta gọi hàm từ lớp kế thừa từ

lớp MIDlet nên có thể truyền vào con trỏ this.

Các đối tượng có thể hiển thị lên màn hình là các đối tượng thuộc lớp Displayable (sẽ được giới thiệu sau), ví dụ như form, TextBox, Canvas, Screen….

Ví dụ:

public class Vidu extends MIDlet {

Form mainForm; Vidu()

{

mainForm = new Form (//………); }

public void startApp() {

Display display = Display.getDisplay(this); Display.setCurrent(mainForm);

} }

4.1.1.2. Lớp Displayable.

Như đã đề cập, một ứng dụng MIDlet chỉ có một đối tượng Display duy nhất và đối tượng Display này dùng để thể hiện các đối tượng Displayable lên màn hình. Như tên của lớp Displayable cho chúng ta thấy, đây là các đối tượng có khả năng hiển thị thông tin lên màn hình thiết bị. Lớp Displayable bao gồm 2 lớp con là lớp Screen và lớp Canvas. Cụ thể chúng được định nghĩa như sau:

abstract public class Displayable;

public abstract class Canvas extends Displayable; public abstract class Screen extends Displayable;

Lớp Screen còn được chia thành những lớp con nhỏ hơn như: TextBox, List, Form và Alert. Đây là những lớp giao diện cấp cao (vì phần lớn các công việc thể hiện các lớp này đã được cài đặt sẵn). Các đối tượng của lớp Canvas được gọi là những đối tượng đồ họa cấp thấp, các lớp này cho phép chúng ta xử lý các giao tác đồ họa ở tầng dưới, xử lý màu sắc và chủ yếu dùng trong quá trình viết Games. Ở những phần sau chúng ta sẽ tìm hiểu kỹ hơn về các lớp giao diện ở cấp thấp lẫn cấp cao.

Bảng 6:Các phương thức chính của lớp Displayable.

Phương thức Mô tả

Void

addCommand(Command cmd)

Thêm một đối tượng Command vào đối tượng Displayable

Void removeCommand (Command

cmd)

Xóa bỏ một đối tượng Command từ đối tượng Displayable

(CommandListener l) Displayble

boolean isShown() Kiểm tra đối tượng Displayable có được thể

hiện trên thiết bị hay không?

Tại thời điểm này chúng ta có thể hình dung một Command như một nút ấn điều khiển trong ứng dụng của chúng ta, CommandListener có tác dụng chuyển các sự kiện khi người dùng kích họat một Command đến lớp xử lý của ứng dụng. Để “bắt” được các sự kiện được chuyển tới khi người dùng kích họat một Command, ứng dụng của chúng ta phải cài đặt hàm commandAction.

Ví dụ như sau:

public void commandAction (Command c, Displayable s) { if(c==cmdExit) { destroyApp(true); notifyDestroyed(); } } 4.1.2. Quản lý các sự kiện:

Ngày nay, việc xử lý sự kiện là một trong những vấn đề cơ bản nhất của một chương trình. Có thể nói, trong thế giới thực phần mềm ngày nay không một chương trình nào lại không có khả năng tương tác với người dùng, do đó việc quản lý các sự kiện phát sinh là một vấn đề mà bất cứ phần mềm nào cũng phải thực hiện. Quá trình xử lý các sự kiện phát sinh bao gồm 3 quá trình cơ bản:

 Phần cứng phải đảm nhận được khi có một sự kiện phát sinh: người dùng ấn một phím, một cable được cắm vào hay rút ra.

 Phần mềm trên thiết bị phải nhận biết có sự kiện phát sinh.

 Hệ điều hành chuyển thông tin về sự kiện cho ứng dụng, bắt đầu từ đây là công việc của những lập trình viên J2ME. Tùy theo các thông tin về sự kiện mà chúng ta phải đưa ra các giải pháp thích hợp.

Trong phần này chúng ta chỉ nghiên cứu về các sự kiện phát sinh ở những ứng dụng sử dụng các chức năng đồ họa ở mức cao (Form, TextBox….), còn các sự kiện phát sinh ở những ứng dụng sử dụng các thư viện đồ họa ở mức thấp như games sẽ được đề cập sau.

Thực chất để nhận được thông báo từ hệ điều hành về các sự kiện phát sinh lớp ứng dụng chính của chúng ta phải cài đặt (implement) các “listener”. Trong J2ME hỗ trợ sẵn cho chúng ta 2 listener là CommandListener và ItemStateListener. Lớp CommandListener có hàm commandListener() và tương ứng lớp ItemStateListener có hàm itemStateChange(), đây là 2 hàm chúng ta cần cài đặt để nhận biết các sự kiện xảy ra. Trước khi đi sâu vào các sự kiện chúng ta sẽ tìm hiểu 2 tác nhân chính phát sinh một sự kiện là Command và Item.

4.1.2.1. Command và CommandListener.

Ta định nghĩa Command là một đối tượng giữ thông tin về một sự kiện. 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 động, khi ta chọn nút này thì sẽ phát sinh một sự kiện tương ứng.

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 những hạn chế về kích thước của màn hình và 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 trữ thông tin về event.

 Thêm command này vào Form, TextBox hay Alert…(nói chung là 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 sự kiện được kích hoạt, bộ listener sẽ gọi hàm

commandListener() và truyền các thông tin về sự kiện làm thông số cho hàm. Ví dụ.

public class TestCommand extends MIDlet implements CommandListener {

//tạo một form

private Form frmMain;.

//tạo một command để thoát khỏi ứng dụng. private Command cmdExit;

//khởi tạo form.

frmMain = new Form(“Core J2ME”); // Khởi tạo command.

cmdexit = new Command(“Exit”, Command.Exit, 1);

frmMain.addCommand(cmdExit); // Thêm command váo form. frmMain.setCommandListener(this); // Thêm bộ listener cho form. //Hàm dùng để bắt sự kiện.

public void commandAction(Command c, Displayable s) {

if(c == cmdExit) // nếu là command exit thì 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 từ CommandListener) và phải cung cấp hàm commandListener để xử lý các events.

Khi ta tạo một command có ba đối số cần cung cấp:

Ví dụ: cmdHelp = new Command(“Help”, Command.HELP, 1); Thì: “Help” là một label.

Command.HELP là một type.

1 là priority (độ ưu tiên).

 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 là 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 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.

Bảng 7:Các kiểu Type của Command.

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 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.

 Priority: Độ ưu tiên, dùng để sắp xếp các command từ trên xuống dưới hay từ trái sang phải khi được thể hiện chung dạng menu. Giá trị này càng cao thì có độ ư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 packege

4.1.2.2. Item và ItemStateListener

Sự kiện 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 items là một bộ phận có thể gắn kèm lê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 điều có thể phát sinh các sự kiện (chúng ta sẽ tìm hiểu 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 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 họat 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:

 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 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.

Bảng 8:Các hàm trong đối tượng Item.

String getLabel() Lấy nhãn của Item.

void setLabel(String label) Đặt nhãn cho label.

void itemStateChanged(Item item) Được gọi khi giá trị item thay đổi.

Một phần của tài liệu LẬP TRÌNH ỨNG DỤNG MOBILE BẰNG JAVA (Trang 37 - 44)

Tải bản đầy đủ (PDF)

(156 trang)