📄 rectangle_canvas.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 + -