• ベストアンサー

java ME MIDPにおいて

java ME MIDPにおいて Canvasクラスの public void paint(Graphics g){ g.setColor(255,255,255);} で、メインのMIDletクラスが 起動すると自動でpaintが呼ばれる仕組みが理解できません。 また、paintの引数のGraphicsクラスは String.voluOf();のStringクラスの様にインスタンス化せずに使っているクラスですか? さらに、setColoor();もstaticメソッドではないのになぜ使えるのでしょうか? 以上三点、 どういう振る舞いをしているのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

> メインのMIDletクラスが > 起動すると自動でpaintが呼ばれる仕組みが理解できません。 MIDletのクラスを起動しただけではCanvasのpaint()は呼ばれませんね。DisplayクラスのsetCurrent()メソッドを呼んで、どのCanvasインスタンスを使用するかを指定しているはずです。 setCurrent()を呼んだ後、どのような仕組みでpaint()が呼ばれるのかはとりあえず理解する必要はありません。 > paintの引数のGraphicsクラスは > String.voluOf();のStringクラスの様にインスタンス化せずに使っているクラスですか? いいえ、Graphicsのインスタンスがpaint()の引数として渡されます。どこで誰がGraphicsのインスタンスを作っているのかもとりあえず理解する必要はありません。 > setColoor();もstaticメソッドではないのになぜ使えるのでしょうか? gがGraphicsのインスタンスなので、不思議でも何でもありません。

bajiriko
質問者

お礼

なるほど。Canvasインスタンスを呼ぶとpaintメソッドも自動で呼ばれその引数のインスタンスも自動で作るという一連の流れがあるのですね。 因みに、理解する必要が無いというのは… 説明や理解するのが困難だからでしょうか? それとも、(例えば)OSやVM、BREW、CLDCなどのバックグラウンドでの活動によるので、 そういう仕様はjava組み込み系ではブラックボックスとして開発者は一般的に 触れるべきではないという事でしょうか?

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

とりあえず理解する必要がないのはなぜかと言うと、知らなくてもMIDletを書くには困らないからです。 それでも知りたいと思うのは悪いことではありませんが、どのように実装するかはMIDP仕様の守備範囲外であって、A社の携帯電話のMIDPとB社の携帯電話のMIDPとC社のMIDPエミュレータでは実装方法が異なっているかもしれません。このため、一般論としては説明しにくいです。 しかしたとえ実装が異なっていても、MIDPの仕様が守られている限り、どこかで適切なGraphicsインスタンスが作られてそれを引数にpaint()が呼ばれます。

bajiriko
質問者

お礼

今回midpでjavaのルールに沿っての理解をしようとした所、 不可解な振る舞いに直面し、 もしかして、javaでまだ自分が知らない基本的な振る舞いによってなされているのなら、勉強しなければと迷走し、自分には読解し難いjavadocを辿り、行き詰まっていましたのでsalsberryさんの助言で助かりました。 これで安心してまた学ぶ事が出来ます。 ありがとう御座いました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Javaプログラムの繋げ方について。

    Javaプログラムの繋げ方について。 今まで(1)のようなプログラムを書いていました。 作りたいものに向けて色々検索するとやりたいものに近い(2)のようなサンプルプログラムを見つけました。 しかし、Java初心者なもので混ぜ方(?)がわかりません。 現在の私の知識からいうと今までのはアプレットでフレーム使うのはアプリケーションなのかな?別物なのかな?そんな感じです。 もし、混ぜることができるなら何かアドバイスをお願いします。 (1)package test; import java.applet.* ; import java.awt.Label ; import java.awt.Font ; import static java.awt.Font.BOLD ; import java.util.*; import java.awt.Graphics; import java.awt.Image; import java.awt.*; public class test extends Applet{ public void paint(Graphics g){ g.setColor(Color.red); g.fillOval(320, 200, 100, 100); } public void init () { ~~~~~~~~~~~~~~~~ } public void start () { ------------ }}} (2)import java.awt.*; import java.awt.event.*; public class MouseEvent7 extends Frame { int posX = 50; int posY = 50; public static void main(String [] args){ new MouseEvent7(); } //コンストラクタ MouseEvent7(){ this.addWindowListener(new WinAdapter()); //ウィンドウリスナーの登録 this.setSize(200,200); this.setVisible(true); //MouseMotionListenerの登録 addMouseMotionListener( new MouseMotionAdapter(){ public void mouseMoved(MouseEvent e){ posX = e.getX(); posY = e.getY(); repaint(); //paintメソッドを実行 } } ); } public void paint(Graphics g){ g.drawOval(posX,posY,50,50); } } (1)の内容に本当に(2)のプログラムで出来るマウスの動きに合わせて円も動く+クリックしたらそこで止まるだけいいのですが。 出来たら止まった点の座標も取りたいですが、そこまではいってません;;

  • MIDP JavaでメモリイメージをCanvasに表示させたい

    MIDP2.0で携帯ゲームを製作しております。 メモリイメージをCanvasに表示させたいのですが、 できないのでしょうか。 PCのJavaの場合には、MemoryImageSourceというクラスがあるようなの ですが・・・。 一度、GIFやPNG,JPEGに変換してcreateImageメソッドを呼ぶしか ないのでしょうか。もしくは描画メソッドでこつこつ描画する しかないのでしょうか。 何かアドバイスいただければと思います。

    • ベストアンサー
    • Java
  • iアプリ 色変更

    初歩的質問ですが・・・ import com.nttdocomo.ui.*; public class TEST01 extends IApplication { public void start(){ MyCanvas mc = new MyCanvas(); Display.setCurrent(mc); } } class MyCanvas extends Canvas{ public void paint(Graphics g){ g.setColor(g.getColorOfName(g.AQUA)); g.fillRect(0,0,200,200); } } で、g.setColor(g.getColorOfName(g.AQUA))の部分で、 「 Graphics からの static メソッド getColorOfName(int) には静的にアクセスしてください。」 と、エラーがでます。 ですが、実行はできます。なぜ??

    • ベストアンサー
    • Java
  • 「継承されたメソッドの可視性を下げることは出来ません。」というエラーの

    「継承されたメソッドの可視性を下げることは出来ません。」というエラーの意味がわかりません。  JAVA初心者です、宜しくお願いします。  下のようなコードを書きましたが、"void paint(Graphics g)"の箇所で 「Canvasから継承されたメソッドの可視性を下げることは出来ません。」 とのエラーメッセジが出ました。  "public void paint(Graphics g)"とかくと、エラーは消えました。  何故"public"をつける必要があるのでしょうか。  また、クラス自身には、publicをつけない場合には、publicと見なされると本で読みましたが  メッソドにはこのようなルールはないのでしょうか。 ======================================= public class Canvas_test extends Canvas { public static void main(String[] args) { JFrame frame = new JFrame(); frame.setTitle("Canvas_test"); frame.setBounds(0,0,480,380); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setResizable(false); frame.setLayout(null); JPanel cp = new JPanel(); cp.setLayout(null); frame.add(cp); cp.setBounds(38,20,400,300); Canvas canvas = new Canvas_test(); cp.add(canvas); canvas.setBounds(0,0,400,300); frame.setVisible(true); } void paint(Graphics g) { g.drawString("aaaa",40,40); } } ========================================

    • ベストアンサー
    • Java
  • javaの描画関係のプログラムの考え方について

    昔からあるJavaの基本的なグラフィックスのプログラム(下方のサンプル)の構造の基本についてお尋ねします。 プログラムの構成を言葉で言うなら、 1 クラスの設定 2 クラス内部のメソッドの作成(コンストラクタ、paint, main) (mainはメソッドとは言わないかもしれませんが、クラスの中の実働部隊のトップということでそういう位置づけにしました。) ここで疑問ですが、 疑問1 paintメソッドですが、どのようにして呼ばれていると考えるのでしょうか。プログラムの中で呼び出されていないように見えます。 mainの中のw.setVisible(true)とかw.show()が描画せよ、というトリガーだと思いますが、paintを動かせとはストレートには読めません。 w.paint() とかだとTestクラスのオブジェクトwのメソッドpaintを動かしているということが示されるわけですが。こういうのがないですね。 疑問2 mainの中のFrame w=new Test()はTest w=new Test()でも動作しますが、これはあまり気にしなくていいでしょうか。 ---- 以下はプログラムの構造です。--- import 適当に public class Test extends Frame{ public Test(){ クラスと同じ名前なのでコンストラクタですね。 setSize(300,300);ウィンドウのサイズ指定 addWindowListener() などいろいろウィンドウのセッティング ウィンドウの閉じ方とか 描画のためのキャンバスの用意 } public void paint(Graphics g){ g.drawLine(0,0,200,200); 描画本体 この部分をいろいろプログラミングする } public static void main(String[] args){ メインなのでここがスタートライン Frame w=new Test(); オブジェクトを作って // w.show(); w.setVisible(true); 描け } }

  • javaのソースコードがわかりません

    初心者には難しすぎるのでおしえてください。 クラス名 Advance5 ※main()メソッドがあるクラス Sub5_StaticCheck 指示 Advance5 クラス main()メソッド Sub5_StaticCheck クラスのcallDisp()メソッドを呼び出す ※インスタンスを生成せずに実行 Sub5_StaticCheck クラス callDisp()メソッド 定義 修飾子 : public キーワード : static 戻り値の型 : void 引数 : なし 指示 disp()メソッドを実行する その際、BufferedReader クラスを使用してキーボードから文字列を1 つ入力し、入力した文字列を引数として1つ渡す disp()メソッド 定義 修飾子 : public 戻り値の型 : void 引数 : String 型の値を1つ 指示 引数で受け取った値を表示する

  • Javaのダブルバッファリングについてお伺いしたいのですが、

    Javaのダブルバッファリングについてお伺いしたいのですが、 Thred.sleep(20) ペイント部 public void paint(Graphics g) { g.drawImage(wbuffer, int x, int y, this); } アップデートメソッド public void update(Graphics g) { paint(g); } 他のクラスからもこのwbufferの中にいったん書き込むようにしています。 チラつきが出る要因として考えられるのはどんなことがあるのでしょうか? ・オブジェクトの数が多い というのが原因でしょうか。 だいたい5秒おきくらいにチラつきが生じます。

    • ベストアンサー
    • Java
  • javaのエラーの意味がわかりません、お願いします

    今日は、javaを勉強している初心者です。 以下のコードを書いてやりましたが、「sleep(Graphics)は引数()に適用できません」、「Color.Whiteを解決できません」とエラーがでます、エラーの意味が分かりません。 一体何処が間違っているのでしょうか、宜しくお願いします。 ===================================================================== public class ani_Moving_Ball extends Applet { int x; public void paint(Graphics g) { for(x=0 ; x<180 ; ++x) { clear(g); g.drawOval(x,90,19,19); sleep(); } } public void clear(Graphics g) { g.setColor(Color.White); g.fillRect(0,80,200,40); g.setColor(Color.Black); } public void sleep(Graphics g) { double s=0.0; for (int j=1 ; j<100 ; ++j) { for (int k=1 ; k<100 ; ++k) { s =+ Math.sin((double)j); } } } }

    • ベストアンサー
    • Java
  • paint()以外でサブ関数を作りたい

     今晩は、java初心者です、宜しくお願いします。  下の様なウインドウに文字を書くサブ関数を作りましたが、うまく実行出来ません。  しかし、public void paint( Graphics g){ }の中に書いてやるとうまく文字が表示されます。  何故か理由が分かりません。  public void paint( Graphics g ){ }は、Componentクラスのメッソドをオーバーライドしている だけなので、別名のサブ関数で「Graphics g」を引数にとれば同じ考えだと思うのですが、 実行出来ない理由が理解できません。  public void drawLetter( Graphics g )としても、エラーが出るばかりです。  その原因が分かりません、宜しくお願いします。 ==================================================================== public void drawLetter( ) { Graphics aa = getGraphics() ; aa.setFont( new Font( "MS ゴシック" , Font.BOLD , 15 ) ) ; aa.setColor( Color.green ) ; aa.drawString( "String" , 0 , 0 ) ; } ============================================================= public class P1 extends Applet { public void init() { setBackground( Color.cyan ) ; setSize( 600 , 600 ) ; drawLetter( ) ; } public void drawLetter( ) { Graphics aa = getGraphics() ; aa.setFont( new Font( "MS ゴシック" , Font.BOLD , 15 ) ) ; aa.setColor( Color.green ) ; aa.drawString( "String" , 0 , 0 ) ; } public void paint( Graphics g ) { g.setColor( Color.RED ) ; g.drawOval( 300 , 300 , 70 , 70 ) ; g.setColor( Color.RED ) ; g.fillOval( 200 , 200 , 30 , 30 ) ; /* g.setFont( new Font( "MS ゴシック" , Font.BOLD , 15 ) ) ; g.setColor( Color.BLUE ) ; g.drawString( "Orbit" , 50 , 50 ) ; */ } } =======================================================================

    • ベストアンサー
    • Java
  •  super.paint(g)を呼び出す意味が理解できません。

     super.paint(g)を呼び出す意味が理解できません。  お早うございます、JAVAの初心者です、基本的な内容が理解出ずに悩んでいます。  宜しくお願い致します。  以下のプログラムを書いてやりました、「Sample1」は、public void paint(Graphics g)で オーバライドしてやると、そのまま”java”が表示されますが、JFrameTestでは、 public void paint(Graphics g)のなかに「super.paint(g)」を書いてやらないと、 一応windowは表示はされるのですが、パネルが透明になって下の文字とか、 画像が見えてしまいます。(何故か文法エラーにはなりません)  しかし、public void paint(Graphics g)の内に「super.paint(g)」を書いてやると、 普通通り表示されます。  この違いというか原因はなになのでしょうか。  「super.paint(g)」は親クラスのpaintメソッドをを呼び出していると思うのですが、 何故ここで必要なのでしょうか。  「Sample1」との違いが分かりません、何とぞ宜しくお願い致します。 ======================================================= public class Sample1 extends Applet { public void paint(Graphics g) { g.drawString("java",10,10); } } ============================================================ public class JFrameTest extends JFrame { JFrameTest() { setSize(400,300); setTitle("JFrameTest"); } public void paint(Graphics g) { super.paint(g); g.drawString("Today",100,100); } public static void main(String[] args) { JFrame jf = new JFrameTest(); jf.setVisible(true); } }

    • ベストアンサー
    • Java
このQ&Aのポイント
  • 富士通FMV LIFEBOOK AH58/E3のカメラの画質が悪くて困っています。カメラの変更は可能でしょうか?
  • FMVA58E3LNに搭載されている富士通FMV LIFEBOOK AH58/E3のカメラの画像が悪くて使いづらいです。カメラの変更はできるのでしょうか?
  • 富士通FMV LIFEBOOK AH58/E3のカメラの品質が低く、画像がぼやけて見えます。カメラの変更が可能か教えてください。
回答を見る