いままで家では携帯用(DOCOMO)のJAVAしかやっていなかったわけだが・・・ 大学のプログラミングの課題が終わりそうもないので、 家でも大学みたいにコマンドプロント使ってコンパイル→実行できるようにしようと思った。
JDKはすでにダウンロードしてインストールしてあったので、あとは設定だけ。たしかPATHの設定するんだったかな・・・ と思ったら、教科書のはじめにやり方が載っていた。ラッキーv
(XPの場合)コントロールパネル>システム>環境変数で「〜〜のユーザーの環境変数(U)に変数名PATHを追加。 変数値にJDKのbinディレクトリを指定。普通なら「C:\jdk1.3.1_17\bin」こんなかんじ?バージョン古いけど・・・。
これで完了。早速作ったプログラムをjavacでコンパイルしてみる。・・・ちゃんとできた。そして実行!!
実 行 ! !
あれ?mainメッソドがないとかエラーでてきやがる。おれの記述ミスかと思ったが、全然間違ってない。
ネットで調べてみた。
環境変数に[Classpath]という変数があったら、それを編集し、 [変数値]の最後に
「;.(セミコロンとドット)」を追加する。(中略) 「java Sample」
と実行しようとしてもエラーが出て実行できない なんて時は、この Classpath が原因だったりする。
間違えなくこいつが原因だった。「;.」を入れたらきちんと直りましたどさ。めでたしめでたし。
教科書つかえねええええええええ!!!!
Canvasに文字を表示させるとき、改行するのってとっても不便。改行する場合はY座標を変えないといけないし・・・。
そこで役立つのが可変長配列の機能を持ったVectorクラス。これを使うと簡単に改行できちゃった!
今回は
String itex="ここから・改行されます・ほらね?・"
を「・」の部分で改行する。
Vector myVector=new Vector();
int v1=-1,v2=0;
v1=itex.indexOf('・');
while(v1!=-1){
myVector.addElement(itex.substring(v2,v1));
v2=v1+1;
v1=itex.indexOf('・',v2);
}
for(v1=0;v1<= myVector.size()-1;v1++){
g.drawString((String)myVector.elementAt(v1),30,30+18*v1);
}
これを実行すると・・・
ここから
改行されます
ほらね?
と表示されるはず。注意するところは、String itex で「・」をきちんと最後にも打つところかな。じゃないと、最後の「ほらね?」
の部分が表示されない。
この可変配列はとても便利だから、どんどん使っていこうと思う。
こんなに簡単だとは思いもしなかった・・・
imeOn("表示させえる文字",TextBox.DISPLAY_ANY,TextBox.KANA);
これだけでCanvasでIMEが起動できてしまった。
いままでPanelに切り替えてやろうとしていたのが馬鹿らしく思えた。
文字列を取得するのもすげえぇぇ簡単だった。
ユーザーの操作が終わると、
processIMEEventメソッドが呼ばれる。
public void processIMEEvent(int type,String text) {
//確定された時の処理
if (w_type==Canvas.IME_COMMITTED) {
str = text;
}
//キャンセルされたときの処理
if (w_type==Canvas.IME_CANCELED) {
str = null;
}
}
これだけで、IMEに入れた文字が、確定されたときに
String strに文字がセットされる。(この場合、
取り消し(キャンセル)されたときはnullを代入。)
あまりの簡単さに唖然としてしまった・・・。
調べてみた結果
>>画面には、同時に1つのパネルしか表示できません。また、低レベルAPIを混在して使用することはでません。
>>ただし、複数の画面から構成されるアプリケーションが、
高レベルAPI(Panel)と低レベルAPI(Canvas)を切替えて表示することは可能です。
とのこと。表示することは可能!? たしかに、表示は出来たけど・・・。
Panle→Canvasに移ったときにイベント処理が出来なかった。
低レベルAPI(Canvas)では
processEventメソッドをオーバーライドしてイベント処理を行い、
高レベルAPI(Panel)では
イベントリスナーでイベント処理をやっていたわけだが・・・
今回は、componentAction(Component c, int type, int
param)メソッドでPanelに貼り付けたボタンが押された場合、PanelからCanvasに切り替えるようにしていた。
が、どうやらココが問題だったみたい。
同じイベントリスナーでも、KeyListenerで数字キー(5キー)が押されたときにCanvasに移るようにしてみたら、
戻ったあともきちんとCanvasでイベント処理が出来た。
結論:
よくわからないけど、Panel上のボタンが押された時にCanvasに戻るようにすると、
Canvasに移った後のイベント処理ができないが、
keyPressed()メソッドで、任意の数字キーが押された時にCanvasに戻るようにすれば、
Canvasに戻った時にもきちんとイベント処理が行われるみたい。
まあ、今回やりたかったことはCanvasで文字入力をできるようにしたかったわけだが、どうやらDoJa-3.0プロファイルからは、
Canvasでも、このIMEによる文字列入力が可能になったっぽい。
なので、こっちのCanvas.imeOn()メソッドを使った方法をやってみようと思う。DoJa-3.0以前の携帯(504iとか)
使ってる人とかいないしね。
Canvasで文字入力させるだけなのに、、かなり遠回りした気がするな・・・
Canvasでテキストボックス使いたいけど無理っぽいので、しかたなく新しくクラス作ってPanelを継承することに・・・。
テキストボックスを使いたいときに
Display.setCurrent(Main.p1);
で切り替えることに。
ポイントはCanvas,Panelのどちらともメイン(IApplicationを継承したクラス)でstaticにしておいて、
直接アクセスできるようにしておくところ。
static TestCanvas c1;
static TextPanel p1;
public void start(){
c1=new TestCanvas();
p1=new TextPanel();
Display.setCurrent(c1);
c1.exe();
}
CanvasやPanelでオブジェクトを作成してしまうと、思わぬところでコンストラクタが処理されてしまうみたい。
これでうまくいく!!・・・と思ったら。。。
文字の入力が終わり、Panelからボタンを押してCanvasに戻ったときに、
Canvasでのキーイベントが動かなくなってしまっていた!!!!!!!!
public void processEvent(int type,int parm)
でキーイベントを取得しているわけだけど・・・これがまったく処理されなくなっていた。
考えた結果、Panelでの
public void componentAction(Component c, int type, int
param)
が処理されているののではないか!という点。
しかし一日中悩んだが・・・未だに対処法がわからん
知ってる人いたら、マジでだれか教えてください。