首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

Java ME 開發:也說 MVC 設計模式(二)

     編輯:J2ME

模型層:UserDataRecord.java

package com.token.util;

import java.util.Vector;
import javax.microedition.rms.*;

import com.token.model.*;

public class UserDataRecord {
    private static final String RECORDSTORE_NAME = "USER_DB";
    private static RecordStore info;

    public UserDataRecord() {}

    public void openDataBase() {
        try {
            info = RecordStore.openRecordStore(RECORDSTORE_NAME, true);
        } catch (RecordStoreException ex) { info = null; }
    }

    public void closeDataBase() {
        if (info != null) {
            try { info.closeRecordStore(); info = null; }
            catch (RecordStoreException ex) {}
        }
    }

    public int db_addRecord(UserDataItem item) {
        try {
            openDataBase();
            byte[] data = item.getBytes();
            int id = info.getNextRecordID();
            info.addRecord(data, 0, data.length);
            closeDataBase();
            return id;
        } catch (RecordStoreException ex) {}
        return -1;
    }

    public void db_updateRecord(UserDataItem item) {
        try {
            openDataBase();
            byte[] data = item.getBytes();
            info.setRecord(item.getId(), data, 0, data.length);
            closeDataBase();
        } catch (RecordStoreException ex) {}
    }

    public UserDataItem db_getRecord(int id) {
        UserDataItem item = null;
        try {
            openDataBase();
            item = new UserDataItem(id, info.getRecord(id));
            closeDataBase();
        } catch (RecordStoreException ex) {}
        return item;
    }

    public void db_deleteRecord(int id) {
        try { openDataBase(); info.deleteRecord(id); closeDataBase(); }
        catch (RecordStoreException ex) {}
    }

    public void db_deleteAllRecord() {
        try { RecordStore.deleteRecordStore(RECORDSTORE_NAME); }
        catch (RecordStoreException ex) {}
    }

    public Vector db_getRecords() {
        Vector items = new Vector(10, 3);
        openDataBase();
        RecordEnumeration enum1 = null;
        int ind = 0;
        try {
            UserDataItem item = null;
            enum1 = info.enumerateRecords(null, new InnerComparator(), false);
            while (enum1.hasPreviousElement()) {
                ind = enum1.previousRecordId();
                item = new UserDataItem(ind, info.getRecord(ind));
                items.addElement(item);
            }
        } catch (Exception ex) { ex.printStackTrace(); }
        finally {
            try { if (enum1 != null) enum1.destroy(); } catch (Exception e) {}
            closeDataBase();
        }
        return items;
    }

    private class InnerComparator implements RecordComparator {
        public int compare(byte[] rec1, byte[] rec2) {
            if (rec1.length > rec2.length) return RecordComparator.FOLLOWS;
            else if (rec1.length < rec2.length) return RecordComparator.PRECEDES;
            else return RecordComparator.EQUIVALENT;
        }
    }
}

視圖層:WelcomeScreen.java

package com.token.view;

import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.GameCanvas;
import com.token.util.UIController;
import com.token.util.StringDealMethod;
import com.token.view.components.*;

public class WelcomeScreen extends GameCanvas {
    private UIController controller;
    private Graphics graphics;
    private Font ft;
    private String info;
    private String info_wrap[];
    private int width;
    private int height;
    private Menu menu;
    private Head head;
    private BackGround backGround;

    public WelcomeScreen(UIController control) {
        super(false);
        controller = control;
        setFullScreenMode(true);
        graphics = getGraphics();
        width = getWidth();
        height = getHeight();
        menu = new Menu(this);
        head = new Head(this);
        backGround = new BackGround(this);
    }

    public void show() {
        backGround.drawBackGround(this, graphics);
        head.drawHead(this, graphics, "");
        menu.drawMenu(this, graphics, "下一步", "退出");
        drawBody();
    }

    public void drawBody() {
        ft = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD, Font.SIZE_LARGE);
        info = "歡迎使用!\n" + "1 MVC測試;\n" + "2 自動換行測試,繪製可自動識別換行的字符串。\n";
        info_wrap = StringDealMethod.format(info, width - 10, ft);
        graphics.setColor(Color.text);
        graphics.setFont(ft);
        for (int i = 0; i < info_wrap.length; i++) {
            graphics.drawString(info_wrap[i], 5, i * ft.getHeight() + 40, Graphics.TOP | Graphics.LEFT);
        }
    }

    public void clearScreen() {
        graphics.setColor(0xFFFFFF);
        graphics.fillRect(0, 0, width, height);
    }

    protected void keyPressed(int keycode) {
        switch (keycode) {
            case KeyID.SOFT_RIGHT:
                controller.handleEvent(UIController.EventID.EVENT_EXIT, null); break;
            case KeyID.SOFT_LEFT: {
                String editor = "regist_name";
                Object[] args = {"registScreen", editor, null, null, null};
                controller.handleEvent(UIController.EventID.EVENT_NEXT_USER_REGIST_SCREEN, args); break;
            }
            default: ;
        }
    }
}

視圖層:UserRegist.java

package com.token.view;

import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;
import com.token.model.*;
import com.token.util.*;
import com.token.view.components.*;

public class UserRegist extends GameCanvas implements Runnable {
    private UIController controller;
    private Graphics graphics;
    private Font ft;
    private Menu menu;
    private Head head;
    private BackGround backGround;
    private UserDataRecord userRecord;
    private String title;
    private TextEdit textEdit_name;
    private TextEdit textEdit_passwd;
    private TextEdit textEdit_passwd_re;
    private int textEdit_name_x, textEdit_name_y;
    private int textEdit_passwd_x, textEdit_passwd_y;
    private int textEdit_passwd_re_x, textEdit_passwd_re_y;
    private int currentlySelectedIndex = 0;
    private String username, passwd, passwd_re;
    long caretBlinkDelay = 500L;
    long lastCaretBlink = 0;
    private String object_name, editor;
    private boolean cursorBlinkOn1, cursorBlinkOn2, cursorBlinkOn3;
    private int width, height;

    public UserRegist(UIController control) {
        super(false);
        this.controller = control;
        this.title = "用戶註冊";
        setFullScreenMode(true);
        graphics = getGraphics();
        width = getWidth(); height = getHeight();
        menu = new Menu(this);
        head = new Head(this);
        backGround = new BackGround(this);
        userRecord = new UserDataRecord();
        textEdit_name = new TextEdit(this);
        textEdit_passwd = new TextEdit(this);
        textEdit_passwd_re = new TextEdit(this);
    }

    public void show(Object[] args) {
        setFullScreenMode(true);
        object_name = ((String)args[0] != null) ? (String)args[0] : "";
        editor = ((String)args[1] != null) ? (String)args[1] : "";
        username = ((String)args[2] != null) ? (String)args[2] : "";
        passwd = ((String)args[3] != null) ? (String)args[3] : "";
        passwd_re = ((String)args[4] != null) ? (String)args[4] : "";
        if (editor.equals("regist_name")) { cursorBlinkOn1 = true; cursorBlinkOn2 = false; cursorBlinkOn3 = false; currentlySelectedIndex = 0; }
        else if (editor.equals("regist_passwd")) { cursorBlinkOn1 = false; cursorBlinkOn2 = true; cursorBlinkOn3 = false; currentlySelectedIndex = 1; }
        else if (editor.equals("regist_passwd_re")) { cursorBlinkOn1 = false; cursorBlinkOn2 = false; cursorBlinkOn3 = true; currentlySelectedIndex = 2; }
        draw(); redraw();
    }

    public void draw() {
        backGround.drawBackGround(this, graphics);
        head.drawHead(this, graphics, this.title);
        menu.drawMenu(this, graphics, "下一步", "退出");
        drawBody();
    }

    private void redraw() {
        switch (currentlySelectedIndex) {
            case 0: cursorBlinkOn2 = false; cursorBlinkOn3 = false; editor = "regist_name"; break;
            case 1: cursorBlinkOn1 = false; cursorBlinkOn3 = false; editor = "regist_passwd"; break;
            case 2: cursorBlinkOn1 = false; cursorBlinkOn2 = false; editor = "regist_passwd_re"; break;
            default: ;
        }
        textEdit_name.drawTextBox(this, graphics, username, textEdit_name_x, textEdit_name_y, cursorBlinkOn1);
        textEdit_passwd.drawTextBox(this, graphics, passwd, textEdit_passwd_x, textEdit_passwd_y, cursorBlinkOn2);
        textEdit_passwd.drawTextBox(this, graphics, passwd_re, textEdit_passwd_re_x, textEdit_passwd_re_y, cursorBlinkOn3);
        textEdit_name.flushGraphics();
    }

    public void drawBody() {
        int margin = 5;
        ft = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD, Font.SIZE_LARGE);
        String info = "用戶名:\n";
        String info_wrap1[] = StringDealMethod.format(info, width - 10, ft);
        graphics.setFont(ft); graphics.setColor(Color.text);
        for (int i = 0; i < info_wrap1.length; i++)
            graphics.drawString(info_wrap1[i], 5, (i) * ft.getHeight() + 40, Graphics.TOP | Graphics.LEFT);
        textEdit_name_x = 5;
        textEdit_name_y = info_wrap1.length * ft.getHeight() + 40;
        textEdit_name.drawTextBox(this, graphics, username, textEdit_name_x, textEdit_name_y, cursorBlinkOn1);

        info = "用戶密碼:\n";
        String info_wrap2[] = StringDealMethod.format(info, width - 10, ft);
        graphics.setFont(ft); graphics.setColor(Color.text);
        for (int i = 0; i < info_wrap2.length; i++)
            graphics.drawString(info_wrap2[i], 5, (i + info_wrap1.length) * ft.getHeight() + textEdit_name.height + margin + 40, Graphics.TOP | Graphics.LEFT);
        textEdit_passwd_x = 5;
        textEdit_passwd_y = (info_wrap1.length + info_wrap2.length) * ft.getHeight() + textEdit_name.height + margin + 40;
        textEdit_passwd.drawTextBox(this, graphics, passwd, textEdit_passwd_x, textEdit_passwd_y, cursorBlinkOn2);

        info = "密碼確認:\n";
        String info_wrap3[] = StringDealMethod.format(info, width - 10, ft);
        graphics.setFont(ft); graphics.setColor(Color.text);
        for (int i = 0; i < info_wrap3.length; i++)
            graphics.drawString(info_wrap3[i], 5, (i + info_wrap1.length + info_wrap2.length) * ft.getHeight() + textEdit_name.height + textEdit_passwd.height + 2 * margin + 40, Graphics.TOP | Graphics.LEFT);
        textEdit_passwd_re_x = 5;
        textEdit_passwd_re_y = (info_wrap1.length + info_wrap2.length + info_wrap3.length) * ft.getHeight() + textEdit_name.height + textEdit_passwd.height + 2 * margin + 40;
        textEdit_passwd_re.drawTextBox(this, graphics, passwd_re, textEdit_passwd_re_x, textEdit_passwd_re_y, cursorBlinkOn3);
    }

    public void clearScreen() {
        graphics.setColor(0xFFFFFF);
        graphics.fillRect(0, 0, width, height);
    }

    public void checkTimeStamp() {
        long currentTime = System.currentTimeMillis();
        if (lastCaretBlink + caretBlinkDelay < currentTime) {
            if (editor.equals("regist_name")) { cursorBlinkOn1 = !cursorBlinkOn1; cursorBlinkOn2 = false; cursorBlinkOn3 = false; }
            else if (editor.equals("regist_passwd")) { cursorBlinkOn1 = false; cursorBlinkOn2 = !cursorBlinkOn2; cursorBlinkOn3 = false; }
            else if (editor.equals("regist_passwd_re")) { cursorBlinkOn1 = false; cursorBlinkOn2 = false; cursorBlinkOn3 = !cursorBlinkOn3; }
            lastCaretBlink = currentTime;
        }
    }

    public void run() {
        while (true) {
            checkTimeStamp();
            redraw();
            try { synchronized(this) { wait(50L); } } catch (Exception e) { e.printStackTrace(); }
        }
    }

    protected void keyPressed(int keyCode) {
        switch (keyCode) {
            case KeyID.SOFT_RIGHT:
                controller.handleEvent(UIController.EventID.EVENT_EXIT, null); break;
            case KeyID.SOFT_LEFT: {
                if (!username.equals("") && !passwd.equals("") && !passwd_re.equals("")) {
                    if (passwd.equals(passwd_re)) {
                        userRecord.db_deleteAllRecord();
                        if (userRecord.db_getRecord(1) == null) {
                            UserDataItem userItem = new UserDataItem(1, (username + "," + passwd).getBytes());
                            userRecord.db_addRecord(userItem);
                            userItem = null; System.gc();
                        }
                        String update = "start";
                        Object[] args = {"activeScreen", null, update};
                        controller.handleEvent(UIController.EventID.EVENT_NEXT_ACTIVE_TOKEN_SCREEN, args);
                    }
                } break;
            }
            case KeyID.KEY_EDIT:
            case Canvas.KEY_NUM0: case Canvas.KEY_NUM1: case Canvas.KEY_NUM2: case Canvas.KEY_NUM3:
            case Canvas.KEY_NUM4: case Canvas.KEY_NUM5: case Canvas.KEY_NUM6: case Canvas.KEY_NUM7:
            case Canvas.KEY_NUM8: case Canvas.KEY_NUM9: {
                Object[] args = {object_name, editor, username, passwd, passwd_re};
                controller.handleEvent(UIController.EventID.EVENT_USER_REGIST_EDIT, args); break;
            }
            default: ;
        }
        keyCode = getGameAction(keyCode);
        switch (keyCode) {
            case Canvas.UP: case Canvas.LEFT: {
                currentlySelectedIndex--; if (currentlySelectedIndex < 0) currentlySelectedIndex = 0; else redraw(); break;
            }
            case Canvas.DOWN: case Canvas.RIGHT: {
                currentlySelectedIndex++; if (currentlySelectedIndex > 2) currentlySelectedIndex = 2; else redraw(); break;
            }
        }
    }
}

* TextEdit 為基於 GameCanvas 繪製的自定義文本編輯框,後續文章將給出具體實現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved