« 日記 | メイン | 日記 »

2005年05月24日

(prg

覚書

ノート取る程の事では無いと思うのでチラシの裏に書きます。

表示

import javax.microedition.lcdui

Display.getDisplay(this).setCurrent(msg)

getDisplay(MIDlet foo)
で、setCurrent(Displayable)をメソッドとして持つオブジェクトを生成する。

簡単に(WIN32API風に)書くと、

Displayクラスから自身のアプリハンドルを引数としてインスタンスを作り出し、
そのメソッドであるsetCurrentを使用して描画すると。
描画するためには自身のアプリハンドルが必要ではあるが、
Displayクラスのインスタンスを作る際に渡してあり、それがそのインスタンス内の変数に登録されているため、
メソッドの呼び出しだけでOKなのであろう。

で、Displayクラスのインスタンスを作るためにgetDisplayメソッドを呼び出す?
混乱してきた。とりあえずここはそーゆーものだと思っておこう。
某言語自体の学習を進めていけば意味がわかるかもしれない。
それでもわからなかったら、この考え方が間違っているということ。

多分、このようなやり方はC++とMFCでも普通にありそうな予感。
MFCって全く見た事無いので嘘言ってるかも。

表示2

lcduiパッケージにDisplayクラスがあり、そのクラスのメソッド「setCurrent(Displayable)」を用いて描画する。
Displayableコンポーネントは、CanvasまたはAlert、Form、List、TextBoxがある。

つまりー、DisplayクラスのインスタンスのメソッドsetCurrentに描画部品クラスのインスタンスへのポインタを渡したら描画してくれると。
……全然つまりになってない気はする。

表示3

Formコンポーネント

Formコンポーネントには色々な部品を取り付けられる。
その部品はItemクラスから生成する。

class Form{

  Form(String title)
}

(こうなってるかは知らない)

とりあえず引数の文字列をそのフォームのタイトルとして登録する。
いらない時はnull。基本的にいらないのではなかろうか。

で、Formに部品を取り付けるには
Formクラスのメソッド「append(Item item)」を使う。
引数は

ChoiceGroup 
DateField 
Gauge 
ImageItem 
StringItem 
TextField 

といった種類があるっぽい。
んで、多分文字列を入れたらStringItemとされるのであろう。
よく覚えてないけど多重定義って奴?

なんか

で、これは
http://www.s.soka.ac.jp/~may/kokai02/chap2.html
こいつを見ながらの覚書なんですけど、
http://sterdust.net/ez/prog/canvas.html
こっちが更にややこしい。引用すると

HelloMIDlet.java

public HelloMIDlet(){
helloCanvas = new HelloCanvas(this);

Display.getDisplay(this).setCurrent(helloCanvas);
}

HelloMIDlet helloMIDlet;

HelloCanvas(HelloMIDlet hMIDlet){

this.helloMIDlet = hMIDlet;

}

HelloCanvas.java

public void paint(Graphics g){

g.setColor(0);
g.drawString("へろ~" , getWidth()/2 , getHeight()/2 , g.HCENTER|g.TOP );
}

こんな感じになってるわけです。
だがしかし、paintメソッドをどこからも呼び出していない。
HelloCanvasクラスから作ったhelloCanvasインスタンス(と言っていいのかな。ポインタ変数の名前なんだけど)をさっき書いたsetCurrentメソッドに渡しているので、
これだけで解釈するとsetCurrentメソッドは渡されたインスタンスのpaintメソッドにGraphics型のポインタを渡す(というよりGraphicsクラスのインスタンスと書いた方が某言語っぽいんだろうか)働きをする場合もあるって解釈でいいのかな。
そうだとすると、何かもうキモすぎるんですが……。
まあ、きっとこれも学習しているうちに(略

public void paint(Graphics g){はCanvasクラスのメインとなるメソッドです。
ここで引数に使われているGraphicsに任意の描画処理を行うことで
画面(Canvas)に結果が反映されることになります。
このメソッドはコンストラクタの後、1度実行されます。
このプログラムではその1回しか実行しませんが、
再度画面を描画させるときはpaint()ではなくrepaint()を呼びます。

上記URLからの引用ですが、
これを読むとCanvasクラスを継承したらコンストラクタをオーバーライド(というのだろうかこれも)していたとしても、
paintメソッドがコンストラクタの後に自動的に実行されるって事なんでしょうか。
そうだとしたらキモすぎるんですが。

キモいというのは、例外?のように見える行動が多すぎてどうなってるんだこりゃー
という意味なのですが、実際どうなんでしょう。勉強していくうちに(略
まあ、そうでしょうね。独習某言語もまだHelloWorldまでしか読んでないし。
あとは、「某言語は嫌い」という先入観というか偏見も理解を妨げているのかもしれない。

投稿者 miff : 2005年05月24日 23:22

コメント



XREAAD