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

📄 keypaint.java

📁 这是一个用J2ME开发的计算器程序
💻 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 + -