/* iアプリ, MIDP での Panel/Form の使用例 Time-stamp: "2005/12/08 Thu 19:51 hig" Saburo Higuchi 2003-2005 http://www.math.ryukoku.ac.jp/~hig/ プログラム解説等 http://www.a.math.ryukoku.ac.jp/~hig/course/juniors_2005/09/ */ #if DOJA import com.nttdocomo.ui.*; #elif MIDP import javax.microedition.midlet.*; import javax.microedition.lcdui.*; #endif #if DOJA #elif MIDP #else // DoJa/MIDP Builder を使われる方へ: // まず, プログラムの先頭で, #define DOJA // などと定義する必要があります. // 以下の define 文は, #if - #endif の中に書かれていますので, // DoJa/MIDP Builder のプリプロセッサでは処理できません. // そこで, #if - #endif はやめて, // いらない方をJava の意味でコメント文にしてください. #endif #if DOJA #define MYALIGN +0 #define MYAP IApplication #define MYSTART start #define MYBLACK Graphics.getColorOfName(Graphics.BLACK) #define MYWHITE Graphics.getColorOfName(Graphics.WHITE) #define MYBLUE Graphics.getColorOfName(Graphics.BLUE) #define MYRED Graphics.getColorOfName(Graphics.RED) #define MYGREEN Graphics.getColorOfName(Graphics.GREEN) #define MYYELLOW Graphics.getColorOfName(Graphics.YELLOW) #define MYMAGENTA Graphics.getColorOfName(Graphics.MAROON) #define MYCYAN Graphics.getColorOfName(Graphics.AQUA) #define MYDIALOG Dialog #define MYLABEL Label #define MYADD add #define MYTEXT Text #define MYCHOICE ListBox #define MYTEXTBOX TextBox #define MYPANEL Panel #define MYNULL +"" #define MYGETTEXT getText #define MYSETTEXT setText #elif MIDP #define MYALIGN ,Graphics.LEFT|Graphics.BOTTOM #define MYAP MIDlet #define MYSTART startApp #define MYBLACK 0 #define MYWHITE ( (255<<16) + (255<<8) + (255)) #define MYBLUE ( (0<<16) + (0<<8) + (255)) #define MYRED ( (255<<16) + (0<<8) + (0)) #define MYGREEN ( (0<<16) + (255<<8) + (0)) #define MYYELLOW ( (255<<16) + (255<<8) + (0)) #define MYMAGENTA ( (255<<16) + (0<<8) + (255)) #define MYCYAN ( (0<<16) + (255<<8) + (255)) #define MYDIALOG Alert #define MYLABEL StringItem #define MYADD append #define MYTEXT String #define MYIMAGELABEL ImageItem #define MYCHOICE ChoiceGroup #define MYTEXTBOX TextField /* MIDP の TextBox は Form と同列みたいなもの */ #define MYPANEL Form #define MYNULL ,null #define MYGETTEXT getString #define MYSETTEXT setString #endif /** IApplication または MIDlet を継承するクラス */ public class PanelSample extends MYAP { /** 起動するときに呼ばれる メソッド. 必須. */ #if DOJA public void start(){ PanelCanvas cc=new PanelCanvas(this); Display.setCurrent(cc); } #elif MIDP public void startApp(){ PanelCanvas cc = new PanelCanvas(this); Display.getDisplay(this).setCurrent(cc); } public void pauseApp(){} public void destroyApp(boolean unconditional){} #endif } /** Canvas を継承するクラス. */ class PanelCanvas extends Canvas implements #if DOJA SoftKeyListener,ComponentListener #elif MIDP CommandListener #endif { PanelSample parent; MYPANEL p; private int x [] = {10,20,30,40}; // 四角形の x,y 座標と 幅 w 高さ h String tblabel [] = {"x","y","w","h"}; MYTEXTBOX tbparam[]; MYTEXTBOX tb1; // 出力用 MYTEXTBOX tb2; // 入力用 MYCHOICE li1; // 選択 // 色の種類 int [] color={MYBLACK, MYBLUE, MYRED, MYGREEN, MYYELLOW, MYMAGENTA, MYCYAN}; String [] colname={"黒","青","赤","緑","黄","マゼンタ","シアン"}; int curcolor=0; #if DOJA // Button は DOJA にのみ存在 Button bt1; // ソフトキーラベル String cctitle [] = {"入力","ダミー"};// キャンバスでのソフトキー String cftitle [] = {"図","ダミー"}; // パネルでのソフトキー #elif MIDP // コマンドキー Command cc []; Command cf []; // コマンドキーラベル String cctitle [] = {"入力","ダミー"};// キャンバスでのコマンドキー String cftitle [] = {"図", "反映"}; // フォームでのコマンドキー #endif /** コンストラクタ. 最初に1回だけ実行される */ PanelCanvas(PanelSample m){ this.parent=m; // ソフトキー, コマンドキーの設定 #if DOJA setSoftLabel(Frame.SOFT_KEY_1, cctitle[0]); setSoftLabel(Frame.SOFT_KEY_2, cctitle[1]); #elif MIDP cc = new Command [ cctitle.length ]; for(int i=0; i< cctitle.length; i++){ cc[i]=new Command(cctitle[i],Command.SCREEN,i); addCommand(cc[i]); } setCommandListener(this); #endif } public void paint(Graphics g){ // 画面を消す g.setColor(MYWHITE); g.fillRect(0,0,getWidth(),getHeight()); // 特定の色の長方形 g.setColor(color[curcolor]); g.fillRect(x[0],x[1],x[2],x[3]); } /** Panel/Form を表示するメソッド*/ public void showPanel(){ #if DOJA p = new MYPANEL(); p.setTitle("入力してね"); // Label を追加 MYLABEL lb1=new MYLABEL("ラベルの例"); #elif MIDP p = new MYPANEL("入力してね"); // MYLABEL を追加 MYLABEL lb1=new MYLABEL("ラベル","テキスト"); #endif p.MYADD(lb1); // Ticker を追加. 追加される場所が異なる. Ticker tc1=new Ticker("これがTickerの例です。右から左に文字列が流れていきます。"); #if DOJA p.MYADD(tc1); #elif MIDP p.setTicker(tc1); #endif #if DOJA // Button を追加 DoJa にしかない bt1 = new Button("ボタンの例"); // bt1 は、このメソッドの中で宣言するのでなく、 // クラスメンバーとして宣言している。 // bt1 は componentAction にも知っていてもらわないといけないから。 p.MYADD(bt1); #elif MIDP #endif // 画像つきラベル // 画像ファイルの読み込みはコンストラクタでやっておいてもよい #if DOJA MediaImage mi=MediaManager.getImage("resource:///pose0.gif"); try{ mi.use(); Image img=mi.getImage(); ImageLabel il=new ImageLabel(img); p.MYADD(il); } catch (Exception e){ p.MYADD(new MYLABEL("読み込み失敗")); } #elif MIDP try{ Image img=Image.createImage("/pose0.png"); ImageItem il=new ImageItem("題名",img,ImageItem.LAYOUT_CENTER,"代用テキスト"); p.MYADD(il); } catch (Exception e){ p.MYADD(new MYLABEL("報告","読み込み失敗")); } #endif // (表示用) TextBox を追加 #if DOJA tb1 = new TextBox("",16,3,TextBox.DISPLAY_ANY); // "表示する文字列",横,縦,そのまま表示指定 tb1.setEditable(false); // ユーザーは入力不可 tb1.MYSETTEXT("イベント表示領域。これは最初に表示される内容。"); #elif MIDP tb1 = new MYTEXTBOX("イベント表示","",16*3,TextField.ANY); tb1.MYSETTEXT("イベント表示領域。これは最初に表示される内容。"); // MIDP では, TextField は編集禁止にできない. // 編集禁止にしたいなら StringItem を使う. #endif p.MYADD(tb1); // (入力用) TextBox を追加 #if DOJA tb2 = new TextBox("",16,3,TextBox.DISPLAY_ANY); tb2.setEditable(true); // ユーザーは入力可 #elif MIDP tb2 = new MYTEXTBOX("タイトル","",16*3,TextField.ANY); #endif p.MYADD(tb2); // 数値入力用 TextBox tbparam = new MYTEXTBOX [x.length]; for(int i=0; i < x.length ; i++){ #if DOJA p.MYADD(new Label(tblabel[i])); tbparam[i]= new MYTEXTBOX("",3,1,TextBox.DISPLAY_ANY); tbparam[i].setEditable(true); tb2.setInputMode(TextBox.NUMBER); #elif MIDP tbparam[i]= new MYTEXTBOX(tblabel[i],"",3,TextField.NUMERIC); #endif p.MYADD(tbparam[i]); tbparam[i].MYSETTEXT(""+x[i]); } // ListBox を追加 #if DOJA li1 = new MYCHOICE(ListBox.CHOICE); // CHOICE, RADIO_BUTTON, SINGLE_SELECT, NUMBER_LIST のいずれか。 for(int i=0; i< colname.length ; i++){ li1.append(colname[i]); } li1.select(curcolor); #elif MIDP li1 = new MYCHOICE("色",Choice.EXCLUSIVE); for(int i=0; i< colname.length ; i++){ li1.MYADD(colname[i],null); } li1.setSelectedIndex(curcolor,true); #endif p.MYADD(li1); // リスナーの登録 #if DOJA p.setComponentListener(this);// このクラスの componentListner を使う。 // DOJA では Panel と Canvas でソフトキーの扱いが異なる. p.setSoftLabel(Frame.SOFT_KEY_1,cftitle[0]); p.setSoftLabel(Frame.SOFT_KEY_2,cftitle[1]); p.setSoftKeyListener(this); #elif MIDP /* MIDP では component Listener はない.*/ /* MIDP ではコマンドキーの扱いは Canvas と同じ方法でよい.*/ cf = new Command [cftitle.length]; for(int i=0; i < cf.length; i++){ cf[i] = new Command(cftitle[i], Command.SCREEN,i); p.addCommand(cf[i]); } p.setCommandListener(this); #endif // Panel/Form p に制御を移す #if DOJA Display.setCurrent(p); #elif MIDP Display.getDisplay(parent).setCurrent(p); #endif } #if DOJA /** イベントリスナ。implements ComponentListner を宣言したらこれが必要*/ public void componentAction(Component source, int type, int param){ if( source == bt1 && type == BUTTON_PRESSED ){ tb1.MYSETTEXT("ボタンが押されたみたい。"); } else if ( source == tb2 && type == TEXT_CHANGED ){ tb1.MYSETTEXT(tb2.MYGETTEXT() + "と入力されたみたい。"); } else if ( source == li1 && type == SELECTION_CHANGED ){ if( param < 0){ return; } else { tb1.MYSETTEXT("選択が" + param + "番目の" + li1.getItem(param) + "に変更されたみたい。"); // ここで curcolor=param してもよいけど, softKeyPressed でやってる } } } // パネルでのソフトキーイベント public void softKeyPressed(int key){ if( key==Frame.SOFT_KEY_1 ){ for(int i=0; i< x.length ; i++){ x[i]=Integer.parseInt(tbparam[i].MYGETTEXT()); } curcolor=li1.getSelectedIndex(); Display.setCurrent(this);// Canvas に復帰 } } public void softKeyReleased(int key){ } // Canvas でのソフトキーイベント public void processEvent(int type, int param){ if( type==Display.KEY_PRESSED_EVENT ){ switch( param ){ case Display.KEY_SOFT1: showPanel(); break; default: } } } #elif MIDP // Canvas/Form でのコマンドイベント public void commandAction(Command cx, Displayable s){ if( cx==cc[0] ){ // 値入力 showPanel(); } else if ( cx==cf[0] ){ // 図表示 for(int i=0; i< x.length ; i++){ x[i]=Integer.parseInt(tbparam[i].MYGETTEXT()); } curcolor=li1.getSelectedIndex(); Display.getDisplay(parent).setCurrent(this); } else if ( cx==cf[1] ){ curcolor=li1.getSelectedIndex(); tb1.MYSETTEXT( "色は" + colname[curcolor] + " " + "入力は" + tb2.MYGETTEXT()); } } protected synchronized void keyPressed(int keyCode){ } protected synchronized void keyReleased(int keycode){ } protected synchronized void keyRepeated(int keycode){ } #endif } /* Local Variables: mode: java End: */