⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rectangle_canvas.java

📁 J2ME下的图形编程实例,包括简单图形的绘制,以及一个打老鼠的游戏实现.可为学习参考.
💻 JAVA
字号:
package ch05;

import javax.microedition.lcdui.*;

public class Rectangle_Canvas
    extends Canvas {

  //声明一个代表屏幕宽度的int型属性变量
  private int width;

  //声明一个代表屏幕高度的int型属性变量
  private int height;

  //声明一个代表边框线条宽度的int型属性变量
  static final int BORDER = 2;

  //声明一个代表字体的Font对象
  private Font font;

  //声明一个代表三个字符宽度的int型属性变量
  private int label_w; //"999"

  //声明一个代表三个字符高度的int型属性变量
  private int label_h; //"999"

  //声明一个代表当前合成颜色的int型属性变量
  private int rgbColor;

  //声明一个代表颜色面板数量的int型属性变量
  private int radix = 10;
  private int pndx;

  //声明一个代表当前操作三原色彩条的索引int型属性变量
  private int ndx = 0; // 0代表blue, 1代表green, 2代表red

  //声明一个代表设备支持彩色的状态变量
  private boolean isColor;

  //声明一个代表基色取值一次按键改变的幅度
  private int delta = 0x20;

  //声明一个存储颜色面板初值的数组
  private int[] palette = {
      0xffff00,
      0x00ffff, 0xff00ff, 0xffff00,
      0xc00000, 0x00c000, 0x0000c0,
      0x80ffff, 0xff80ff, 0xffff80};

  /*
   3.构造器
   */
  public Rectangle_Canvas(boolean isColor) {
    setTitle("绘制矩形实例");
    this.isColor = isColor;

    ndx = 0;
    pndx = 0;
    setColor(palette[pndx]);

    width = getWidth();
    height = getHeight();

    font = Font.getDefaultFont();
    label_h = font.getHeight();
    if (label_h > (height / 6)) {
      font = Font.getFont(Font.FACE_SYSTEM,
                          Font.STYLE_PLAIN,
                          Font.SIZE_SMALL);
      label_h = font.getHeight();
    }
    label_w = font.stringWidth("999");
  }

  /*
   4.设置颜色面板当前颜色。
   */
  public void setColor(int RGB) {
    rgbColor = RGB & 0x00ffffff;
    palette[pndx] = rgbColor;
  }

  /*
   5.获取当前颜色红色基色。
   */
  public int getRedComponent() {
    return (rgbColor >> 16) & 0xff;
  }

  /*
   6.获取当前颜色绿色基色。
   */
  public int getGreenComponent() {
    return (rgbColor >> 8) & 0xff;
  }

  /*
   7.获取当前颜色兰色基色。
   */
  public int getBlueComponent() {
    return rgbColor & 0xff;
  }

  //实现paint()方法。
  protected void paint(Graphics g) {
    if (isColor) {
      colorPaint(g);
    }
  }

  /*
   8.格式化数字。
   */
  private String format(int num) {
    String s = Integer.toString(num, radix);
    if (radix == 10 || s.length() >= 2) {
      return s;
    }
    return "0" + 2;
  }

  /*
   9.用当前颜色绘制。
   */
  private void colorPaint(Graphics g) {

    int p_w = width / palette.length;//palette.length=10
    int p_h = (height - (BORDER * 3)) / 4;
    int usable_w = p_w * palette.length;

    int sample_w = p_w * palette.length - 1;
    int sample_h = p_h;

    int sample_x = (width - usable_w) / 2;
    int sample_y = 0;
    int p_x = sample_x;
    int p_y = sample_y + sample_h + 4;

    //填充背景色
    g.setColor(0xffffff);
    g.fillRect(0, 0, width, height);

    //设置当前颜色
    g.setColor(rgbColor);

    g.fillRect(sample_x, sample_y, sample_w, sample_h);
    g.setColor( (ndx < 0) ? 0x000000 : 0x808080);
    g.drawRect(sample_x, sample_y, sample_w - 1, sample_h - 1);

    //绘制颜色面板
    for (int i = 0; i < palette.length; i++) {
      g.setColor(palette[i]);
      int shift = ( (i == pndx) ? BORDER * 2 : 0);
      g.fillRect(p_x + i * p_w, p_y - shift, p_w - 1, p_h);

      //绘制当前选中颜色面板
      if (i == pndx) {
        g.setColor( (ndx < 0) ? 0x000000 : 0x808080);
        g.drawRect(p_x + i * p_w, p_y - shift - 1, p_w - 2, p_h + 1);
      }
    }

    int bars_x = sample_x;
    int bars_y = p_y + p_h + BORDER;

    int bar_h = label_h + BORDER;
    int bar_w = usable_w - label_w - BORDER;

    int b_x = label_w + BORDER;
    int b_y = bars_y + BORDER;
    int g_y = b_y + bar_h;
    int r_y = g_y + bar_h;

    //绘制基色条
    g.setColor(0, 0, 255);
    int b_w = (bar_w * getBlueComponent()) / 255;
    g.fillRect(b_x, b_y, b_w, bar_h - BORDER);
    g.setColor( (ndx == 0) ? 0x000000 : 0xa0ffa0);
    g.drawRect(b_x, b_y, bar_w - 1, bar_h - BORDER - 1);

    int g_w = (bar_w * getGreenComponent()) / 255;
    g.setColor(0, 255, 0);
    g.fillRect(b_x, g_y, g_w, bar_h - BORDER);
    g.setColor( (ndx == 1) ? 0x000000 : 0xa0ffa0);
    g.drawRect(b_x, g_y, bar_w - 1, bar_h - BORDER - 1);

    int r_w = (bar_w * getRedComponent()) / 255;
    g.setColor(255, 0, 0);
    g.fillRect(b_x, r_y, r_w, bar_h - BORDER);
    g.setColor( (ndx == 2) ? 0x000000 : 0xffa0a0);
    g.drawRect(b_x, r_y, bar_w - 1, bar_h - BORDER - 1);

    //绘制基色取值
    g.setFont(font);
    g.setColor(0, 0, 0);
    g.drawString(format(getBlueComponent()),
                 label_w, b_y + bar_h, Graphics.BOTTOM | Graphics.RIGHT);
    g.drawString(format(getGreenComponent()),
                 label_w, g_y + bar_h, Graphics.BOTTOM | Graphics.RIGHT);
    g.drawString(format(getRedComponent()),
                 label_w, r_y + bar_h, Graphics.BOTTOM | Graphics.RIGHT);
  }

  //响应连续按键事件
  public void keyRepeated(int key) {
    keyPressed(key);
  }

  /*
   10.响应按键事件
   */
  protected void keyPressed(int key) {
    int action = getGameAction(key);
    int dir = 0;
    switch (action) {
      case RIGHT:
        dir += 1;
        break;
      case LEFT:
        dir -= 1;
        break;
      case UP:
        ndx -= 1;
        break;
      case DOWN:
        ndx += 1;
        break;
      default:
        return;
    }

    if (isColor) {
      if (ndx < -1) {
        ndx = -1;
      }
      if (ndx > 2) {
        ndx = 2;
      }
      if (ndx >= 0) {
        int v = (rgbColor >> (ndx * 8)) & 0xff;
        v += dir * delta;
        if (v < 0) {
          v = 0;
        }
        if (v > 255) {
          v = 255;
        }
        int mask = 0xff << (ndx * 8);
        rgbColor = (rgbColor & ~mask) | v << (ndx * 8);
        palette[pndx] = rgbColor;
      }
      else {
        pndx += dir;
        if (pndx < 0) {
          pndx = 0;
        }
        if (pndx >= palette.length) {
          pndx = palette.length - 1;
        }
        rgbColor = palette[pndx];
      }
    }
    repaint();
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -