ホーム > デベロッパ > J2ME / MIDP プログラミング > 仕様・設計と実装

仕様・設計と実装 (improve の機能仕様と MIDP のつまずきどころ)

001:import javax.microedition.lcdui.*;
002:
003:/**
004: * 確認ダイアログ 2 の画面を提供します。
005: */
006:public class DialogTest2Form extends Form implements CommandListener {
007:
008:    /** コマンド処理ロック */
009:    private static boolean lock;
010:
011:    /** 「Yes」と「No」 */
012:    private static final String DIALOG_YES = "Yes";
013:    private static final String DIALOG_NO  = "No";
014:
015:    /** 「結果」のラベルとテキスト */
016:    private StringItem itemResult;
017:
018:    /** 「表示」コマンド */
019:    private Command cmdShow;
020:
021:    /** 
022:     * コンストラクタ。画面の準備をします。
023:     */
024:    public DialogTest2Form() {
025:        super("DialogTest2");
026:
027:        // コマンドの作成とリスナーの登録
028:        cmdShow = new Command("表示", Command.SCREEN, 1);
029:        addCommand(cmdShow);
030:
031:        setCommandListener(this);
032:
033:        // コンポーネントの初期化
034:        itemResult = new StringItem("ダイアログの結果:\n", " ");
035:        append(itemResult);
036:        append("----- [説明] -----\n「表示」で確認ダイアログを表示します。");
037:    }
038:
039:    /**
040:     * コマンドハンドラ。各コマンドが発行された時の処理を行います。
041:     * @param c コマンド
042:     * @param d ディスプレイ
043:     */
044:    public void commandAction(Command c, Displayable d) {
045:        System.out.println("DialogTest2Form#commandAction() " 
                                           + Thread.currentThread());
046:        if (lockCommandAction()) {
047:            Thread thread = new Thread(new ProcessCommand(c, d));
048:            thread.start();
049:        }
050:    }
051:
052:    /**
053:     * コマンド処理のロック
054:     * @return ロックが取得できたかどうか
055:     */
056:    private static synchronized boolean lockCommandAction() {
057:        if (lock) {
058:            return false;
059:        }
060:        lock = true;
061:        return true;
062:    }
063:
064:    /**
065:     * コマンド処理のロック解除
066:     */
067:    private static synchronized void unlockCommandAction() {
068:        lock = false;
069:    }
070:
071:    /**
072:     * コマンド処理スレッドクラス
073:     */
074:    private class ProcessCommand implements Runnable {
075:        private Command command;
076:        private Displayable displayable;
077:
078:        /**
079:         * コンストラクタ
080:         */
081:        public ProcessCommand(Command c, Displayable d) {
082:            command = c;
083:            displayable = d;
084:        }
085:
086:        /**
087:         * ここで実際のコマンド処理を行います。
088:         */
089:        public void run() {
090:            try {
091:                if (command == cmdShow) {
092:                    // 「表示」が押された時の処理
093:                    // 確認ダイアログを表示
094:                    int result = showDialog("確認ダイアログ2", "OK ですか?");
095:
096:                    // 結果を画面に表示
097:                    switch (result) {
098:                        case DialogForm.STATUS_LEFT:
099:                            itemResult.setText(DIALOG_YES);
100:                            break;
101:
102:                        case DialogForm.STATUS_RIGHT:
103:                            itemResult.setText(DIALOG_NO);
104:                            break;
105:
106:                        default:
107:                            itemResult.setText("");
108:                            break;
109:                    }
110:               }
111:            } catch (Exception e) {
112:                e.printStackTrace();
113:            }
114:
115:            // コマンド処理が終了したのでロック解除
116:            DialogTest2Form.unlockCommandAction();
117:        }
118:
119:        /**
120:         * 確認ダイアログを表示
121:         * @param title ダイアログのタイトル
122:         * @param message ダイアログのメッセージ
123:         */
124:        public int showDialog(String title, String message) {
125:            // ダイアログを作成、表示
126:            DialogForm dialog = new DialogForm(title, message);
127:            DialogTest2MIDlet.display.setCurrent(dialog);
128:
129:            // ソフトキーが押されるのを待つ
130:            synchronized (dialog) {
131:                try {
132:                    dialog.wait();
133:                } catch (InterruptedException e) {
134:                   e.printStackTrace();
135:                }
136:            }
137:
138:            // 元の画面に切り替える
139:            DialogTest2MIDlet.display.setCurrent(displayable);
140:
141:            return dialog.getCommandStatus();
142:        }
143:    }
144:
145:    /**
146:     * 確認ダイアログクラス
147:     */
148:    private class DialogForm extends Form implements CommandListener {
149:
150:        /** ステータス定数 */
151:        public static final int STATUS_NONE  = 0;
152:        public static final int STATUS_LEFT  = 1;
153:        public static final int STATUS_RIGHT = 2;
154:
155:
156:        /** ステータス */
157:        private int status;
158:
159:        /**
160:         * コンストラクタ
161:         * @param title ダイアログのタイトル
162:         * @param message ダイアログのメッセージ
163:         */
164:        public DialogForm(String title, String message) {
165:            super(title);
166:
167:            status = STATUS_NONE;
168:
169:            // コマンドの作成とリスナーの登録
170:            addCommand(new Command(DIALOG_YES, Command.BACK, 1));
171:            addCommand(new Command(DIALOG_NO, Command.OK, 1));
172:
173:            setCommandListener(this);
174:
175:            // コンポーネントの初期化
176:            append(message);
177:        }
178:
179:        /**
180:         * コマンドステータス取得
181:         * @return どのキーが押されたかを表わす定数
182:         */
183:        public int getCommandStatus() {
184:            return status;
185:        }
186:
187:        /**
188:         * コマンドハンドラ。各コマンドが発行された時の処理を行います。
189:         * @param c コマンド
190:         * @param d ディスプレイ
191:         */
192:        public synchronized void commandAction(Command c, Displayable d) {
193:            System.out.println("DialogForm#commandAction() " +
                                                       Thread.currentThread());
194:            switch (c.getCommandType()) {
195:                case Command.BACK:
196:                    status = STATUS_LEFT;
197:                    notify();
198:                    break;
199:
200:                case Command.OK:
201:                    status = STATUS_RIGHT;
202:                    notify();
203:                    break;
204:
205:                default:
206:                    break;
207:            }
208:        }
209:    }
210:}