Xử lý sự kiện trên giao diện mức cao trong MIDlet


Có 2 loại sự kiện có thể xảy ra trên giao diện người dùng mức cao của ứng dụng MIDlet: sự kiện trên các Command và sự kiện trên các Item.

Trong ứng dụng MIDlet, giao diện người dùng được chia làm 2 loại:
  1. Giao diện người dùng mức thấp: tạo thành bởi các lớp họ Canvas, GameCanvas ....; cho phép người lập trình tùy ý tạo nên giao diện theo ý của mình (chủ yếu là bằng cách vẽ nên hoặc sử dụng ảnh tạo sẵn để bố trí).
  2. Giao diện người dùng mức cao: tạo thành bởi các thành phần giao diện được tạo sẵn trong J2ME (package javax.microedition.lcdui). Các thành phần giao diện này giải quyết phần lớn nhu cầu giao tiếp giữa ứng dụng MIDlet và người dùng với các điều khiển như: TextField, StringItem(label), List .....
Với mỗi loại giao diện người dùng, ta lại có các loại sự kiện cần xử lý riêng, chúng được gọi là Sự kiện mức thấp và sự kiện mức cao. Trong bài viết này, tôi sẽ đề cập đến Xử lý sự kiện trên các thành phần giao diện mức cao.

Có 2 loại sự kiện có thể xảy ra trên giao diện người dùng mức cao của ứng dụng MIDlet: sự kiện trên các Command và sự kiện trên các Item.

Để xử lý sự kiện trên các Command:

 ta cần thi hành giao diện CommandListener trong đó hiện thực hóa phương thức commandAction (Command, Displayable).

class CommandHandler implements CommandListener{

        public void commandAction(Command c, Displayable d){

            if (c==cmExit){

                destroyApp(true);

                notifyDestroyed();

            }

        }

    }


Sau khi định nghĩa lớp xử lý sự kiện cho Command, ta cần đăng ký nó với Form chứa Command bằng phương thức setCommandListener(commandListenerObject)

        f = new Form("ItemStateChange Example");        

        cmExit = new Command("Exit", Command.EXIT, 0);

        ....

        //Them Command va dang ky lang nghe su kien cho Command

        f.addCommand(cmExit);

        f.setCommandListener(new CommandHandler());



Các sự kiện trên các thành phần giao diện còn lại (TextField, Gauge, List, ChoiceGroup, .....) xảy ra khi trạng thái hay giá trị của chúng bị thay đổi. Để xử lý loại sự kiện này ta cần thi hành giao diện ItemStateListener trong đó hiện thực hóa phương thức itemStateChange(Item )


class ItemHandler implements ItemStateListener{

        public void itemStateChanged(Item item){

            if (item == tf){//nếu sự kiện xảy ra trên tf

                si.setText(String.valueOf(tf.getString().length()));

            }

        }

    }


Sau khi định nghĩa lớp xử lý sự kiện cho Item, ta cần đăng ký nó với Form chứa Item bằng phương thức setItemStateListener(itemStateListenerObject)

        f = new Form("ItemStateChange Example");

        tf = new TextField ("Input:","", 30, TextField.ANY);

        si = new StringItem("Length", "0");

        .....

        f.append(tf);

        f.append(si);

        .....        

        //dang ky lang nghe su kien tren cac Item

        f.setItemStateListener(new ItemHandler());


Download file ví dụ: ItemStateChangeEx.java

( đã được xem 4151 lần từ 19/05/2009 )

Phản hồi bài viết

   
Họ tên  
Email*
Mã xác thực email
Tiêu đề*  
Nội dung*  
Đính kèm 
 
 
Đào Văn Hay thienthanbongtoi90ht@...
Hỏi Thầy Dũng về cách xây dựng danh mục quản lý các môn học có lưu trữ bằng RMS
Thầy ơi, Thầy hướng dẫn em với. Em đang tìm hiểu về RMS và xây dựng ứng dụng danh mục các môn học. E muốn hỏi thầy là khi em tạo ra các ô và viết String và các ô đó. Em làm cách nào để di chuyển và chọn vào những ô đó vậy Thầy. Em cám ơn thầy ạ!
Phạm Văn Đoan - ICE44-UCT doan281@...
Hỏi thêm về J2ME.
Hi anh (A/a)!
- Bài viết này, đúng là cái mà e đang cần, thanks a nhiều nhé!
- A cho e hỏi thêm: trong J2ME, e muốn làm tròn số thực thì phải viết code như thế nào? VD: làm tròn 123.456 thành 123.46 (e mới tự học nên chưa biết làm thế nào, e ko tìm thấy hàm nào trong tài liệu đính kèm khi cài IDE nên chắc phải viết hàm quá).
- Rất mong a giúp đỡ!
Lê Hữu Dũng huudungle@...
Lấy giá trị năm từ 1 Date
java cung cấp đối tượng Calendar để làm việc này.
Em có thể sử dụng đoạn chương trình như sau:
[code=java]
Date dt = dfNgaysinh.getDate();//lấy thời gian từ DateField ra
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+7"));//tạo đối tượng Calendar
cal.setTime(dt);//đặt thời gian đã lấy ở trên vào Calendar
int nam = cal.get(Calendar.YEAR);//lấy năm
[/code]
Nguyễn Quang Huy huyfithou@...
J2ME - MIDlet
thưa thầy cho em hỏi. trong giao diện mức cao. để lấy đuọc giá trị năm mà ngừoi dùng chọn trong DateFile thì xử lý như thế nào ạ. Em dùng hàm getDate() thì nó trả ra cả ngày giờ
em xin cảm ơn thầy
votanminh lop 0607A2 votanminh812@...
thay giup e voi !
thay cho e xin pas file zip tai lieu ve phan nay voi a !thank thay nhieu a ^^
Huudung huudung@...
re Trường
Với một người mới "tập học" như em nói thì để làm được bài này, đầu tiên cần phải biết
1. Tạo 1 MIDlet đơn giản
2. Tạo MIDlet với giao diện mức thấp (dùng Canvas hoặc GameCanvas để vẽ)
3. Khi đã viết được bước 2 rồi thì vẽ lưới caro và tô màu là chuyện không khó đâu.

Mục 1 và 2 có trong website này của tôi đấy
Nguyễn Văn Trường thanhha_0123456789@...
J2ME - MIDlet


(vẽ một lưới Caro các ô vuông lên màn hình,tô màu cho 3 ô bất kỳ)
Em chào Thầy,Thầy giúp em câu hỏi trên được không vậy?Em vừa mới tập học.Thầy giúp em nhe. IT HEU
huudung huudung@...
itemstatechange
em dung chinh itemstatechange nay day. Viec loc ki tu textfield da chia loai san khi tao roi
Sơn_05B6 sd.fury@...
cho em hỏi
Thầy Dũng ơi, có cách nào bắt sự kiện Keypress trong textfield hay text box
huudung huudung@...
Keep going on
Giờ trước hết là viết những mảnh còn chưa có cái đã.
Sau này nhiều rồi thì sắp xếp lại chúng là thành Step By Step ngay.
Giờ làm series kiểu đó lâu lắm mà lại không có "cầu"
Trang 1, 2
Tôi là Lê Hữu Dũng
Giảng viên CNTT
Khoa Công nghệ Tin học
Viện Đại học Mở Hà Nội