📄 keypaint.java
字号:
package Calc;
import java.io.*;
import java.lang.*;import javax.microedition.lcdui.*;public class KeyPaint { private int colorBack = 0x000000, colorFont = 0, colorPadBack = 0x555588, colorBorder = 0x999999, colorInside = 0xffffff;
private int colorNumBack = 0x888888, colorNumFont = 0xffffff, colorNumBorder = 0x555555, colorNumOutter = 0xaaaaaa;
private int colorSelBack = 0x9999cc, colorSelFont = 0xffff00, colorSelBorder = 0xff8888, colorSelOutter = 0xee7777;
private int canvW, canvH, fntNPW, fntNPH, fntNPL, fntNPT, fntENW, fntENH, fntENL, fntENT, fntMax; //字体参数
private int keyW, keyH, padW, padH, padL, padT, padS, padB; //数字键盘区参数
private int txtW, txtH, txtL, txtR, txtT, txtS, txtB, txtN, txtENL, txtENR, txtENT;
private int[] left={0,0}, top={0,0}, width={0,0}, height={0,0}, fntL = {0,0}; //两个键盘对照表的左、上、宽、高、字符的相对位置
private String strLR[] = {"",""}; //两个键盘对照表上显示的内容
private String resultStr = "";
private int numLR[] = {10, 10, 7, 9, 10, 0,0, 0,0,0}; //键盘对照表上当前按键的对应位置,理论上可以有10组数字键盘对照表
private int ttlPad = 4; //共设置了几个键盘
private int curPad = 0; //当前活动键盘0-左或1-右
private int rightPad = 1; //右侧是哪个键盘1-9,左侧始终是0
private int show1or2Pad = 0; //共显示几块键盘,0-1块且0键盘不显示,1-1块且0键盘显示,2-2块均显示
private int show1of2Pad = 2; //1块时的显示位置,0-无,1-左,2-中,3-右
private int keyPadShow = 2; // 0-不显示,1-显示,2以上显示若干次以后再判断是否显示
private Font fntNP, fntEN, fntNPB;
private KeyNum keynum = new KeyNum();
private KeySet keyset = new KeySet();
private Func func = new Func();
public KeyPaint(int w, int h) { canvW = w; canvH = h;
//canvW = 128;
fntNP = Font.getFont(0, 0, 0); fntEN = Font.getFont(0, 1, 0); fntNPB = Font.getFont(0, 1, 0);
fntNPH = fntNP.getHeight(); fntNPW = fntNP.stringWidth("8");
fntENH = fntEN.getHeight(); fntENW = fntEN.stringWidth("8");
padB = 2; //数字小方块的边框粗线
padS = 2; //两个之间的间隔
keyH = fntNPH + 2; //小方块的高
keyW = fntNPW*3+2; //小方块的宽
padH = padB*2*4 + keyH*4 + padS*3; //方块区的高
padW = padB*2*3 + keyW*3 + padS*2; //方块区的宽
padL = (canvW - padW*2) / 3; //方块区的左边距
//padL = (show1or2Pad < 2 ? (canvW-padW)/2 : padL);
//if (padL < 2) { padS -= Math.abs(padL)/3; padL = 2;}
padT = 2; //方块区的上边距
fntNPL = (keyW - fntNPW) / 2 + padB;
fntNPT = (keyH - fntNPH) / 2 + padB;
txtS = 3;
txtB = 1;
txtL = (padL < 2 ? 2 : padL);
txtR = canvW - txtL - txtS;
txtT = (show1or2Pad < 2) ? padT : (padT + padH + txtS + txtB);
padT = (show1or2Pad < 2) ? (padT + txtS + txtB*2) : padT;
txtW = padW*2 + padL;
txtW = (txtW > canvW ? canvW - 4 : txtW);
txtH = canvH - txtT - txtS - txtB;
txtN = txtH / (txtS + fntENH) - 1;
txtENL = txtL + txtS * 2;
txtENR = txtR - txtS;
fntMax = txtW / fntENW - 2;
keyset.setMaxNum(fntMax);
}
private final String int2str(int i2) {
if(i2 >= 10)
{return "" + i2;}
else
{return "0" + i2;}
}
public void setCurrentPad(int cur) {
if ( cur >= 2 || cur < 0) {
curPad = 1 - curPad ; //记录0-左侧,1-右侧
} else {
curPad = cur;
}
}
public void setRightPad(int right) {
rightPad = (right > ttlPad ? ttlPad : (right < 1 ? 1 : right));
//rightPad += right;
//if (rightPad >= ttlPad) {rightPad = 1;}
//if (rightPad < 1) {rightPad = ttlPad-1;}
curPad = 1;
}
// public void setGraphics(Graphics ga) {
// g = ga;
// }
public void setPressedKey(int k, int gk) {
if ( keyPadShow == 0 && (k < 0 && k >= -5 && gk > 0 && gk <= 8) ) { //键盘没有显示,且按了方向键、确认键
if ( k == -5 && gk == 8 ) {
keyset.setKey("="); //没有显示键盘并且按下了FIRE键
} else if ( k == -1 && gk == 1 ) { //上键
setRightPad(4);
} else if ( k == -2 && gk == 6 ) { //下键
setRightPad(3);
} else if ( k == -3 && gk == 2 ) { //左键
setRightPad(1);
} else if ( k == -4 && gk == 5 ) { //右键
setRightPad(2);
}
} else {
if (k > 30 || k <= -5) {
numLR[curPad * rightPad] = keynum.KeyInt(numLR[curPad * rightPad], k, curPad * rightPad); //原来是第几个键,按了哪个键,哪个盘
if (keynum.KeyType() != -9) { //非方向键
//keyset.setKey(keynum.KeyStr(), keynum.KeyType());
keyset.setKey(keynum.KeyStr());
curPad = 0; //按了有效键以后,键盘就变回为数字键盘
}
} else { //只有四个方向键
numLR[curPad * rightPad] = keynum.GameInt(numLR[curPad * rightPad], curPad * rightPad, gk); //第几个键,哪个盘,什么动作
}
}
}
public void paintAll(Graphics g, boolean all) { if (!all) {return;}
paintWindow(g);
paintResult(g);
paintNumPad(g);
}
private void paintResult(Graphics g){
g.setColor(colorFont);
g.setFont(fntEN);
for (int i = keyset.getlast(), j = txtN ; i >= keyset.getfirst() && j > 0; i--, --j) {
if (keyset.allowset()) {
resultStr = keyset.getrecn0(i);
for (int k = (resultStr.length()/fntMax) ; j > 0 && k >= 0 ; k--) {
//String s = func.sSub(resultStr, k * fntMax, (k + 1) * fntMax );
String s = func.sRight(resultStr, fntMax);
resultStr = func.sLess(resultStr, fntMax);
txtENT = txtT + j * (fntENH + txtS);
g.drawString( s,txtENR, txtENT, 24);
j--;
}
//j -= k;
g.drawString( "Set", txtW/2, txtT, 17);
//g.drawString( keyset.getrecm(i), txtENL, txtENT, 20);
//g.drawString( keyset.getrecn(i), txtENR, txtENT, 24);
} else {
txtENT = txtT + j * (fntENH + txtS);
g.drawString( keyset.getrecm(i), txtENL, txtENT, 20);
g.drawString( keyset.getrecn(i), txtENR, txtENT, 24);
}
//System.out.println(keyset.str[i%10]+"|"+txtL+"|"+txtT+"|"+txtN);
}
if (keyset.getmemo().length() > 0) {
g.drawString((keyset.allowset() ? "Memo" : "M = "+keyset.getmemo()), txtENL, txtT+txtB, 20);
}
g.drawString(keyset.getABCDEF(6), txtENR, txtT+txtB, 24);
}
private void paintWindow(Graphics g){
g.setColor(colorBack);
g.fillRect(0, 0, canvW, canvH);
g.setColor(colorBorder);
g.drawRect(txtL, txtT, txtW, txtH);
g.setColor(colorInside);
g.fillRect(txtL+2, txtT+2, txtW-3, txtH-3);
}
private void paintNumPad(Graphics g){
//画出两块数字键盘区。活动的是哪一个由curPad记录,0-左侧;1-右侧。右侧是哪一个由rightPad记录。
//System.out.println("paint number pad !");
if ( ( (show1or2Pad + curPad) * show1of2Pad) == 0 && (keyPadShow < 2) ) { keyPadShow = 0; } else { keyPadShow = 1; }
width[0] = padB + keyW; width[1] = width[0]; height[0] = padB + keyH; height[1] = height[0];
for (int i = 0, k = 0, p0=0, p1=1; i < 4; i++) {
top[0] = padT + i * (padB*2 + keyH + padS); top[1] = top[0];
for (int j = 0; j < 3; j++) {
left[0] = padL + j * (padB*2 + keyW + padS); left[1] = left[0] + padW + padL;
if ( show1or2Pad < 2 ) { //只显示一块,0-1块且0键盘不显示,1-1块且0键盘显示,2-2块均显示
p1 = curPad;
p0 = (keyPadShow == 1) ? p1 : 11;
switch ( show1of2Pad ) { //1块时的显示位置,0-无,1-左,2-中,3-右
case 1: left[1] = left[0]; break;
case 2: left[0] = ( left[0] + left[1] ) / 2; left[1] = left[0]; break;
case 3: left[0] = left[1]; break;
default:
}
}
k = i*3+j;
for (int p = p0; p <= p1; p++) {
if (k == 0) {
g.setColor(colorPadBack);
g.fillRect(left[p]-2, top[p]-2, padW+4, padH+4 ); //Pad的背景色
}
strLR[p] = keynum.numPadStr(k, p * rightPad); //p为0-左,1-右;
//strLR[p] = keynum.KeyStr[ j * 12 + keynum.int2pad[i]];
fntL[p] = (keyW - fntNP.stringWidth(strLR[p])) / 2 + padB + 1;
g.setColor(colorNumOutter);
g.drawRect(left[p], top[p], width[p]+1, height[p]+1); //小块外边框
g.setColor(colorNumBorder);
g.drawRect(left[p]+1, top[p]+1, width[p], height[p]); //小块内边框
g.setColor(colorNumBack);
g.fillRect(left[p]+1, top[p]+1, width[p], height[p]); //内部区域
g.setColor(colorNumFont);
g.setFont(fntNP);
g.drawString(strLR[p], left[p] + fntL[p], top[p] + fntNPT, 20); //数字内容
}
if (numLR[curPad * rightPad] == k && (show1or2Pad + show1of2Pad > 1) && (show1or2Pad + curPad > 0) ) {
g.setColor(colorSelOutter);
g.drawLine(left[curPad]-1, top[curPad]-1, left[curPad]+width[curPad]+2, top[curPad]-1); //选择块的上边框
g.drawLine(left[curPad]-1, top[curPad]-1, left[curPad]-1, top[curPad]+height[curPad]+2); //选择块的左边框
g.setColor(colorSelBorder);
g.drawLine(left[curPad], top[curPad]+height[curPad]+2, left[curPad]+width[curPad]+2, top[curPad]+height[curPad]+2);//选择块的下边框
g.drawLine(left[curPad]+width[curPad]+2, top[curPad], left[curPad]+width[curPad]+2, top[curPad]+height[curPad]+2); //选择块的右边框
g.setColor(colorSelBack);
g.fillRect(left[curPad]+1, top[curPad]+1, width[curPad], height[curPad]); //选择块的背景
g.setColor(colorSelFont);
g.setFont(fntNPB);
g.drawString(strLR[curPad], left[curPad] + fntL[curPad] - 1, top[curPad] + fntNPT, 20); //选择块的字体
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -