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 で「・」をきちんと最後にも打つところかな。じゃないと、最後の「ほらね?」
の部分が表示されない。
この可変配列はとても便利だから、どんどん使っていこうと思う。
HDDクラッシュして新しくしたのだが、ウィルス対策ソフト買うお金が・・・。しばらくは無料のを使おうと思い、少し調べてみた。 (以前までマザーボードについていたやつを使っていたのだが、もう期限がきれる)
どうやら、「AVG Anti-Virus Free Edition」と「avast!4 Home Edition」 の2種類が有名だということがわかった。
AVGの方が良いと書いてあるサイトの方が多かった気がするが、今回はあえてavast!4 Home Editionを使ってみることにした。
これを選んだ理由としては、登録は英語だが、ソフト自体が日本語パッチ当てなくても日本語で利用できること。OS 起動後に常駐し、 実行されるファイルやメールを監視OS 起動後に常駐し、実行されるファイルやメールを監視してくれること。なんか初心者向きな感じ。
登録後は14ヶ月ごとに更新しなきゃいけないみたいだけど、そんな長く使わないと思うしな・・・。
まあ暫くは、これを使って様子を見てみようと思う。火壁はルータあるし・・・心配になったらフリーのいれてみようかな。
参考URL
avast 4 Home Edition 登録・利用
ttp://freejp.adam.ne.jp/docs/d0200_04.html
ウイルス対策をしましょう♪
ttp://www.lab-park.net/cont/shirou/virus.html
こんなに簡単だとは思いもしなかった・・・
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)
が処理されているののではないか!という点。
しかし一日中悩んだが・・・未だに対処法がわからん
知ってる人いたら、マジでだれか教えてください。