ネットワークプログラミング
      応用演習


第7回 グラフィック描画とマウスイベント


       2011/11/9
クラスとmain

 今回配布しているTest71.javaでは,
 main関数内でTest71のインスタンスを
 生成している.実行はmainから開始.

  public static void main(String[] args) {
    new Test71();
  }

  Test71() {
    ...ここはコンストラクタ.内容は省略...
  }
new Test71()とは?

   オブジェクト指向言語の用語
   ・クラス ≒ 設計図
   ・インスタンス ≒ 実体(newで生成)
    Test71 t71 = new Test71();
                     ここが省略されている
    設計図


    Test71                  ←newにより
                             生成される
メソッドとstatic

  メソッド宣言にstaticが付いている
  = クラスメソッド
    クラス名+メソッド名で利用
    インスタンス変数(フィールド)に
       アクセス不可

  メソッド宣言にstaticが付いていない
  = インスタンスメソッド
    インスタンス名+メソッド名で利用
    インスタンス変数(フィールド)に
       アクセス可
クラスメソッドとインスタンスメソッドの例

 クラスメソッドの例
 例1:Math.cos( theta );
 例2:System.out.println( "test" );
 例3:System.exit(0);

 インスタンスメソッドの例
 Test t = new Test();
 例1:t.hoge();
 例2:t.fuga();
 など
ウィンドウの表示(P.15)

 Java言語でウィンドウを司るクラスとして
 Frameが存在する.
 まずは,カラのウィンドウを開いてみよう.

  Frame f = new Frame();
  f.setVisible( true );


 1行目でFrameのインスタンスを生成し,
 2行目で表示している.
 ただし,何も無いウィンドウである.
開発が進むとメソッドが増える
 Java言語で大きなプログラムを組む際,
 「メソッドを増やす・クラスを増やす」
 により,確実なプログラミングが要求される

 メソッド間で変数を共有したい
 (共有する変数を数組使いたい)


 インスタンス変数(フィールド)を
 利用することで解決

           後々,説明します
addWindowListenerなど

   マウスなどの操作は,
   イベントとしてプログラムに伝えられる

                 ウィンドウを閉じる

      Test71      Java言語が自動的に
                  windowClosingを実行

                  プログラム終了
 addWindowListener = この動作を登録する
マウスに関連するイベント

 addMouseListenerによるイベント
 mouseClick      クリック
 mouseEntered    領域に入る
 mouseExited     領域から出る
 mousePressed    ボタンが押された
 mouseReleased   ボタンが離された

 addMouseMotionListenerによるイベント

 mouseDragged    ドラッグされた
 mouseMoved      動いた
マウスクリックの処理について

c.addMouseListener( new MouseListener() {
  public void mouseClicked( MouseEvent e ) {
     c.setOval( e.getX(), e.getY() );
  }
  ...以下略...


  イベント内容はeに代入されている.
  詳しくはMouseEventクラスを調べること.
  (課題7-a)
Test72の構造(P.16)
  fの上にcを載せている.
  描画やイベント取得はcに対して行っている




                      f
                  c
MyCanvasクラス
  描画するための自作クラス.Canvasを継
  承.
  Javaでは,描画などのために
  自作クラスを作ることが多い.

              インスタンス変数
              x, y:共にint型の配列
              num:点の数を記憶

   MyCanvas
              インスタンスメソッド
              paint:描画を行う
              setOval:座標を記憶
Test72とMyCanvas
                  (1)cの上でクリック動作

                  (2)c.setOvalを呼び出し,
                       座標を渡す

           c      (3)x[num]とy[num]に
                       座標を記憶
                  (4)numが200以上に
                       なったらnumを0に
                  (5)repainメソッドを実行
                       →paintメソッドが呼ばれる
                  (6)paintメソッド内で
                      num個の点を描画
課題7-b, 7-c
 課題7-bは,ドラッグのイベントを登録すれば良い.
 課題7-cは,以下のような動作を想定している.


                 中ボタン
                 クリック

             c                c

    点描画                 線描画
   なお,どちらの描画モードでも点や線を
   追加できるようにすること.
課題7-cのヒント
MyCanvasクラスのpaintメソッド内で,
現在の描画モード(変数で保持しておく)から
描画に使う命令を変えれば良い.
追加する変数:mode
追加するメソッド:change_mode

                中ボタン
                クリック

            c                     c

 modeが1なら              modeが0なら
 点描画                   線描画

Enshu7