• Thứ Tư, 15/09/2004 15:05 (GMT+7)

    Lập trình J2ME trên ECLIPSE

     

    Những ai đã từng lập trình Java trên Eclipse thường có chung một nhận xét: hài lòng. Thật vậy, công cụ mã nguồn mở được viết bằng Java của dại gia IBM là một công cụ phát triển phần mềm mạnh. Eclipse được phát triển theo mô hình nền (platform), tự nó không cung cấp các chức năng cho người dùng cuối mà chỉ cung cấp một kiến trúc mở để các plugin gắn vào đó làm việc. Chính vì vậy Eclipse giống như một hệ điều hành để chúng ta cài đặt các công cụ cần thiết cho quá trình phát triển ứng dụng. Nó làm hài lòng giới lập trình viên Java vì có khá nhiều plugin mã nguồn mở phục vụ công việc. Hơn nữa, nếu thích, bạn còn dễ dàng phát triển một plugin phục vụ cho mục đích của mình. EclipseME là một plugin của Eclipse dành riêng cho phát triển ứng dụng J2ME.

    Eclipseme

    Được phát triển bởi Craig Setera, EclipseME có đầy đủ các chức năng của một J2ME IDE như: tạo J2ME project, tạo MIDlet, soạn thảo file jad, chạy ứng dụng MIDlet... Điều đặc biệt hơn cả là EclipseME thừa hưởng các tính năng Java IDE tuyệt vời từ Eclipse.

    EclipseME, có mã nguồn mở và có thể tải về sử dụng miễn phí tại địa chỉ www.sourceforge.net/projects/eclipseme. Để chạy được EclipseME, bạn cần phải có J2ME Wireless Toolkit (WTK) 1.0, JDK 1.4 và Eclipse 3.0M9 trở lên.

    1. Cài đặt EclipseME

    Để cài đặt EclipseME, bạn chỉ cần giải nén file zip đến thư mục plugins của Eclipse. Ví dụ, nếu bạn đã cài Eclipse trên C:\eclipse, bạn sẽ cài EclipseME trên C:\eclipse\plugins. Khởi động lại Eclipse nếu nó đang chạy để EclipseME đuợc khởi động.

    2. Cấu hình

    EclipseME đòi hỏi cần phải cấu hình ít nhất một WTK cho nó. Để cấu hình WTK, bạn hãy thực hiện theo các bước sau:

    Khởi động Eclipse

    Vào menu Window->References. Mở mục J2ME, chọn Platform Components. Màn hình xuất hiện như trên hình 1.

    Trong khung bên phải, nhấn chuột phải vào mục Wireless Toolkits, nhấn vào Add Wireless Toolkit

    Cửa sổ hiện ra yêu cầu bạn chọn thư mục cài đặt WTK. Nhấn nút Browse và chọn thư mục WTK bạn đã cài đặt, ví dụ: C:\WTK1.0

    Nhất Finish rồi OK. Quá trình cài đặt và cấu hình đã hoàn tất.

    Tạo và chạy ứng dụng

    1. Tạo J2ME project

    Để tạo một J2ME project, bạn làm theo các bước sau:

    Vào menu File->New->Project

    Cửa sổ New Project hiện ra. Hãy mở mục J2ME, chọn J2ME MIDlet Suite. Nhấn Next.

    Trong cửa sổ kế tiếp, hãy nhập tên project (ví dụ HelloWorld) và chọn thư mục chứa project (ví dụ C:\projects\J2ME). Nhấn Next.

    Bước tiếp theo thực hiện chọn nền WTK mà bạn đã cấu hình. EclipseME cho phép cấu hình nhiều nền J2ME (WTK 1.0, WTK 2.1...). Ví dụ chúng ta chọn J2ME Wireless Toolkit 1.0.4 Platform. Nhấn Next.

    Cuối cùng, bạn có thể thêm các thư viện cần dùng, thêm thư mục chứa source... hay có thể để mọi thứ theo mặc định. Nhấn Finish để kết thúc quá trình tạo J2ME project.

    Bây giờ bạn đã có một bộ khung J2ME project hoàn chỉnh trong workspace sẵn sàng để phát triển ứng dụng J2ME.

    2. Tạo MIDlet

    MIDlet là lớp chính của toàn bộ ứng dụng J2ME. Có thể so sánh nó như một lớp có hàm main của J2SE, một servlet của J2EE hay một applet của ứng dụng applet. Để tạo mới một MIDlet, bạn thực hiện theo các bước sau:

    Trong khung Navigator, nhấn chuột phải trên J2ME project (theo ví dụ ở trên là HelloWorld).

    Trong menu popup hiện ra, chọn New->Other

    Mở mục J2ME, chọn J2ME Midlet. Nhấn Next

    Nhập tên gói chứa MIDlet trong mục package, ví dụ: edu.eclipseme.helloworld

    Nhập tên lớp MIDlet trong mục Name, ví dụ: HelloWorldMIDlet.

    Nhấn nút Finish để kết thúc quá trình tạo MIDlet.

    Vậy là bạn đã có một MIDlet với đầy đủ các phương thức chính (constructor, startApp, pauseApp, destroyApp) trong J2ME project của mình. (Xem Chương trình mẫu HelloWorldMIDlet).

    3. Đóng gói

    Để ứng dụng J2ME chạy được trên thiết bị thật, bạn cần phải đóng gói toàn bộ ứng dụng vào file jar và jad. Với EclipseME, việc đóng gói rất dễ dàng. Bạn thực hiện theo các bước sau:

    Kích chuột phải trên J2ME project của bạn.

    Trên menu hiện ra, chọn J2ME->Create Package

    Hãy mở mục deployed, bạn sẽ thấy có file jad và jar cho ứng dụng của mình đã được tạo.

    4. Chạy ứng dụng

    Chạy ứng dụng J2ME cũng đơn giản như việc chạy ứng dụng Java khác trong Eclipse. Sau đây là các bước để chạy một ứng dụng J2ME:

    Vào menu Run->Run

    Trong khung bên trái, chọn Wireless Toolkit Emulator

    Nhấn nút New

    Bạn có thể chọn thêm các tuỳ chọn khác. Trong khung Excutable, chọn Midlet và nhấn nút Search để EclipseME tự tìm lớp MIDlet cho bạn. Nếu bạn chọn Over the Air, EclipseME sẽ thực thi file jad.

    Kết luận

    EclipseME thật sự là công cụ đáng giá dành cho dân lập trình J2ME. Nếu bạn chưa bao giờ dùng Eclipse, đây sẽ là dịp để bạn làm quen với nó. Và chỉ cần một lần làm quen thôi, tôi tin rằng bạn sẽ khó rời xa nó.

     

    CHƯƠNG TRÌNH MẪU HELLOWORLDMIDlet

     

     

    Chương trình này vẽ một dòng chữ Hello World in đậm màu đỏ ở giữa màn hình điện thoại. Trước khi in dòng chữ, chương trình hiển thị một màn hình intro trong 30 giây với một hình ảnh dạng png làm logo (ở đây dùng logo của JavaVietnam, tuy nhiên ban có thể thay bằng bất kỳ hình nào tuỳ thích).

    HelloCanvas.java: Lớp vẽ dòng chữ Hello World
    package edu.eclipseme.helloworld;
    import javax.microedition.lcdui.Canvas;
    import javax.microedition.lcdui.Font;
    import javax.microedition.lcdui.Graphics;
    //Canvas vẽ chuỗi HelloWorld
    public class HelloCanvas extends Canvas{
                //Bạn hãy vẽ những gì bạn muốn ở đây
                protected void paint(Graphics g) {
                            clearScreen(g);
                            paintHello(g);
                }
                //Xoá màn hình (bôi màu trắng) 
                private void clearScreen(Graphics g){ g.setColor(0xFFFFFF);              
                             g.fillRect(0, 0, getWidth(), getHeight());
                }
                //Vẽ chuỗi Hello World
                private void paintHello(Graphics g){
                            //Chuỗi cần vẽ
                            String hello = 'Hello World';
                            //Màu cần vẽ (đỏ)                     
                            g.setColor(0xFF0000);
                            //Font cần vẽ
                            Font font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_MEDIUM);
                            g.setFont(font);
                            //Vị trí vẽ (giữa màn hình)
                            int x = (getWidth() - font.stringWidth(hello)) / 2;
                            int y = (getHeight() - font.getHeight()) / 2;
                            //Vẽ chuỗi
                            g.drawString(hello, x, y, Graphics.TOP | Graphics.LEFT);
                }
    }

    IntroCanvas.java: Lớp hiển thị màn hình intro.
    package edu.eclipseme.helloworld;
    import java.io.IOException;
    import java.util.Timer;
    import java.util.TimerTask;
    import javax.microedition.lcdui.Canvas;
    import javax.microedition.lcdui.Display;
    import javax.microedition.lcdui.Displayable;
    import javax.microedition.lcdui.Graphics;
    import javax.microedition.lcdui.Image;
    //Hiển thị màn hình intro
    public class IntroCanvas extends Canvas{
                //Bạn có thể thay bằng logo của mình
                private static final String logoName = 'javavietnam_logo.png';   
                            private Display display;
        private Displayable nextScreen;
        private int timeout;
        private Timer timer = new Timer();
                 public IntroCanvas(Display display, Displayable nextScreen, int timeout){
                this.display = display;
                this.nextScreen = nextScreen;
                this.timeout = timeout; 
        }
        //Bắt đầu màn hình intro
        public void startIntro(){
                display.setCurrent(this);
        }
        //Kết thúc màn hình intro
       public void endIntro(){
                display.setCurrent(nextScreen);
        }
                protected void paint(Graphics g) {                                try {
                                        Image logo = Image.createImage(logoName);
                                        g.drawImage(logo, 0, 0, Graphics.TOP | Graphics.LEFT);
                            }
                            catch (IOException e) {
                                g.drawString('Logo Error', 0, 0, Graphics.TOP | Graphics.LEFT);
                            }
                }
                //Thiết lập bộ đếm thời gian
                protected void showNotify() {
                    timer.schedule(new CountDown(), timeout);
                }
                //Kết thúc intro: phím bất kỳ được nhấn 
                 protected void keyPressed(int keyCode) { endIntro();}
                //Kết thúc intro nế u hết thời gian
                private class CountDown extends TimerTask { 
                            public void run() {endIntro();}
                }
    }

    HelloWorldMIDlet.java: Lớp chính
    package edu.eclipseme.helloworld;
    import javax.microedition.lcdui.Canvas;
    import javax.microedition.lcdui.Display;
    import javax.microedition.midlet.MIDlet;
    import javax.microedition.midlet.MIDletStateChangeException;
    //Đây là lớp chính của ứng dụng thừa kế từ lớp MIDlet
     public class HelloWorldMIDlet extends MIDlet {
                private Display display;
                private IntroCanvas introCanvas; 
                private HelloCanvas helloCanvas;         
                //Phuong thuc thiet lap.
                public HelloWorldMIDlet() {
                            super(); 
                }
                //Phương thức này sẽ được gọi bởi KVM khi người dùng nhấn phím Launch trên điện thoại di động.                  
                //@see javax.microedition.midlet.MIDlet#startApp()
                protected void startApp() throws MIDletStateChangeException {
                            display = Display.getDisplay(this);
                            helloCanvas = new HelloCanvas();
                            introCanvas = new IntroCanvas (display, helloCanvas, 30000);
                            introCanvas.startIntro();                        }
                protected void pauseApp() {    }
                protected void destroyApp(boolean arg0) throws MIDletStateChangeException {}      
    }

     


    Ngô Văn Khoa
    billkhoa@yahoo.com

     

    Địa chỉ download:

     

     

    Eclipse: www.eclipse.org
    EclipseME: www.sourceforge.net/projects/eclipseme

     

    ID: A0409_159