Canvasのイベント処理


Canvasでは、コンポーネントのたぐいは一切使えません。基本的には、描画だけですべての表示を作成することになります。基本的に、CanvasはFrameなどと比べると非常にシンプルな作りになっているのです。

となると、イベント処理はどのようになるのでしょうか。実をいえば、Canvasには、何らかのイベント処理を行うためのイベントリスナーを組み込む機能などはまったくありません。そのような便利な機能はないのです。Canvasに用意されているのは、もっと低レベルの機能のみです。

Canvasには、何らかのイベントが発生すると呼び出されるメソッドが用意されています。「processEvent」というもので、Canvasで何かのイベントが発生すればすべてこのメソッドが呼ばれます。したがって、このメソッドの使い方さえ理解していれば、Canvasのイベント処理は比較的簡単です。

では、イベント処理を利用した簡単なサンプルを作成してみましょう。前回と同様、SampleIAppから、MainCanvasクラスを呼び出す形で作成をしておきます。

import com.nttdocomo.ui.*;

public class SampleIApp extends IApplication {

  public void start() {
    Display.setCurrent(new MainCanvas(this));
  }
}

class MainCanvas extends Canvas {
  IApplication iapp;
  int[][] data;
  int x,y;
  
  MainCanvas(IApplication app){
    super();
    this.iapp = app;
    data = new int[][]{
        {0,0,0,0,0},
        {0,0,0,0,0},
        {0,0,0,0,0},
        {0,0,0,0,0},
        {0,0,0,0,0}};
    this.setSoftLabel(Frame.SOFT_KEY_1, "NEW");
    this.setSoftLabel(Frame.SOFT_KEY_2, "QUIT");
  }
  
  public void init(){
    for(int i = 0;i < 5;i++)
      for(int j = 0;j < 5;j++)
        data[i][j] = 1;
    x = 2;
    y = 2;
    data[x][y] = 2;
    this.repaint();
  }
  
  public void change(){
    data[x][y] = 0;
    this.repaint();
  }
  
  public void move(int dx,int dy){
    data[x][y] = data[x][y] == 2 ? 1 : data[x][y];
    int x0 = x;
    int y0 = y;
    x = x + dx;
    y = y + dy;
    x = x < 0 ? 0 : x;
    x = x > 4 ? 4 : x;
    y = y < 0 ? 0 : y;
    y = y > 4 ? 4 : y;
    if (data[x][y] == 0){
      x = x0;
      y = y0;
    }
    data[x][y] = 2;
    this.repaint();
  }
  
  public void paint(Graphics g) {
    g.lock();
    g.setColor(Graphics.getColorOfRGB(255, 255, 255));
    g.fillRect(0, 0, 250, 250);
    for(int i = 0;i < 5;i++)
      for(int j = 0;j < 5;j++){
        switch(data[i][j]){
        case 0:
          g.setColor(Graphics.getColorOfRGB(255, 255, 255));
          g.fillRect(i * 30, j * 30, 30, 30);
          break;
        case 1:
          g.setColor(Graphics.getColorOfRGB(0, 0, 255));
          g.fillArc(i * 30, j * 30, 30, 30, 0, 360);
          break;
        case 2:
          g.setColor(Graphics.getColorOfRGB(255, 0, 0));
          g.fillArc(i * 30, j * 30, 30, 30, 0, 360);
          break;
        }
      }
    g.unlock(true);
  }

  public void processEvent(int type, int param) {
    super.processEvent(type, param);
    switch(type){
    case Display.KEY_PRESSED_EVENT:
      switch(param){
      case Display.KEY_SOFT1:
        init();
        break;
      case Display.KEY_SOFT2:
        iapp.terminate();
        break;
      case Display.KEY_UP:
        move(0,-1);
        break;
      case Display.KEY_DOWN:
        move(0,1);
        break;
      case Display.KEY_RIGHT:
        move(1,0);
        break;
      case Display.KEY_LEFT:
        move(-1,0);
        break;
      case Display.KEY_SELECT:
        change();
      }
    }
  }
  
}