首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

J2ME 簡易計算機實作教學

     編輯:Java 相關知識

專案背景與功能

透過小型專案綜合應用所學技術,強化邏輯思維。本計算機實作:

  • 四則運算(除法為整數除法)
  • 清除輸入功能

核心設計思路:狀態機模式

將程式行為劃分為三個狀態:

  1. INPUT_FIRST:輸入第一個數字
  2. INPUT_FLAG:輸入運算符號(+、-、*、/)
  3. INPUT_SECOND:輸入第二個數字

每個狀態對應特定繪製邏輯與按鍵處理,使程式結構清晰、易於擴展。

數字輸入處理

利用按鍵 KEY_NUM0~KEY_NUM9 的 keyCode 與字符編碼一致的特性:

int digit = keyCode - Canvas.KEY_NUM0; // 取得 0~9

數值累積公式:新值 = 舊值 × 10 + 當前輸入(例:先輸 1 再輸 3 → 13)。

操作說明

  • 數字鍵:輸入數值
  • 星號鍵 (KEY_STAR):循環切換運算符號(+ → - → * → / → +)
  • 左軟鍵 (-6):刪除最後一個字符(數字或符號)
  • 右軟鍵 (-7):計算並顯示結果

完整原始碼 (CalcCanvas.java)

import javax.microedition.lcdui.*;

public class CalcCanvas extends Canvas {
    // 狀態常數
    final int INPUT_FIRST = 1;
    final int INPUT_FLAG = 2;
    final int INPUT_SECOND = 3;
    int status = INPUT_FIRST;

    // 繪製座標
    int x = 150, y = 160, lineHeight = 20;
    int w, h;

    // 資料儲存
    int firstNum = 0, secondNum = 0, flag = 0; // flag: 1=+, 2=-, 3=*, 4=/
    String[] sFlag = {"+", "-", "*", "/"};

    public CalcCanvas() {
        setFullScreenMode(true);
        h = getHeight();
        w = getWidth();
    }

    protected void paint(Graphics g) {
        g.setColor(0xffffff);
        g.fillRect(0, 0, w, h);
        g.setColor(0);

        // 固定按鈕提示
        g.drawString("=", w, h, Graphics.RIGHT | Graphics.BOTTOM);
        g.drawString("C", 0, h, Graphics.LEFT | Graphics.BOTTOM);

        // 依狀態繪製內容
        switch (status) {
            case INPUT_FIRST:
                g.drawString("" + firstNum, x, y, Graphics.RIGHT | Graphics.BOTTOM);
                break;
            case INPUT_FLAG:
                g.drawString("" + firstNum, x, y - lineHeight, Graphics.RIGHT | Graphics.BOTTOM);
                g.drawString(sFlag[flag - 1], x, y, Graphics.RIGHT | Graphics.BOTTOM);
                break;
            case INPUT_SECOND:
                g.drawString("" + firstNum, x, y - 2 * lineHeight, Graphics.RIGHT | Graphics.BOTTOM);
                g.drawString(sFlag[flag - 1], x, y - lineHeight, Graphics.RIGHT | Graphics.BOTTOM);
                g.drawString("" + secondNum, x, y, Graphics.RIGHT | Graphics.BOTTOM);
                break;
        }
    }

    public void keyPressed(int keyCode) {
        // 左軟鍵:清除
        if (keyCode == -6) {
            switch (status) {
                case INPUT_FIRST:
                    firstNum /= 10;
                    break;
                case INPUT_FLAG:
                    status = INPUT_FIRST;
                    flag = 0;
                    break;
                case INPUT_SECOND:
                    secondNum /= 10;
                    if (secondNum == 0) status = INPUT_FLAG;
                    break;
            }
        }

        // 右軟鍵:計算
        if (keyCode == -7) {
            if (status == INPUT_SECOND && secondNum != 0) {
                switch (flag) {
                    case 1: firstNum += secondNum; break;
                    case 2: firstNum -= secondNum; break;
                    case 3: firstNum *= secondNum; break;
                    case 4: firstNum /= secondNum; break;
                }
                status = INPUT_FIRST;
                flag = 0;
                secondNum = 0;
            }
        }

        // 數字鍵
        if (keyCode >= KEY_NUM0 && keyCode <= KEY_NUM9) {
            int digit = keyCode - KEY_NUM0;
            switch (status) {
                case INPUT_FIRST:
                    firstNum = firstNum * 10 + digit;
                    break;
                case INPUT_SECOND:
                    secondNum = secondNum * 10 + digit;
                    break;
                case INPUT_FLAG:
                    status = INPUT_SECOND;
                    secondNum = secondNum * 10 + digit;
                    break;
            }
        }

        // 星號鍵:切換運算符
        if (keyCode == KEY_STAR) {
            if (status == INPUT_FIRST || status == INPUT_FLAG) {
                flag = (flag < 4) ? flag + 1 : 1;
                status = INPUT_FLAG;
            }
        }

        repaint();
    }
}

原文出處

原文連結:CSDN Blog - Mailbomb

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved