高階 UI TextField 在 S40 模擬器上數字輸入繁瑣,改用低階 Canvas 直接處理按鍵事件,實作簡易數字輸入框。
public class NumberInputCanvas extends Canvas {
private StringBuffer input = new StringBuffer();
private final int MAX_LEN = 4; // 輸入長度限制
private int parsedValue; // 解析後的數值
protected void paint(Graphics g) {
g.setColor(0xFFFFFF);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(0x000000);
g.drawString(input.toString(),
getWidth()/2, getHeight()/2,
Graphics.TOP | Graphics.HCENTER);
}
protected void keyPressed(int keyCode) {
// 已達最大長度,只處理確認鍵 (*) 與刪除鍵 (#)
if (input.length() == MAX_LEN) {
switch (keyCode) {
case KEY_STAR: // 確認
parsedValue = Integer.parseInt(input.toString());
// TODO: 觸發後續邏輯
break;
case KEY_POUND: // 刪除
input.deleteCharAt(input.length()-1);
break;
}
repaint();
return;
}
// 未滿長度,處理數字鍵 0-9
if (input.length() < MAX_LEN) {
char c = 0;
switch (keyCode) {
case KEY_NUM0: c = '0'; break;
case KEY_NUM1: c = '1'; break;
case KEY_NUM2: c = '2'; break;
case KEY_NUM3: c = '3'; break;
case KEY_NUM4: c = '4'; break;
case KEY_NUM5: c = '5'; break;
case KEY_NUM6: c = '6'; break;
case KEY_NUM7: c = '7'; break;
case KEY_NUM8: c = '8'; break;
case KEY_NUM9: c = '9'; break;
}
if (c != 0) input.append(c);
}
// 長度>0 時,# 鍵刪除最後一字
if (input.length() > 0 && keyCode == KEY_POUND) {
input.deleteCharAt(input.length()-1);
}
repaint();
}
// 長按 # 鍵一次性清空 (視裝置支援而定)
protected void keyRepeated(int keyCode) {
if (input.length() > 0 && keyCode == KEY_POUND) {
input.setLength(0);
repaint();
}
}
}
keyRepeated() 非 JTWI 強制規範,使用前必須用 Canvas.hasRepeatedEvents() 檢測裝置是否支援。KEY_NUM0 等) 為 Canvas 定義常數,跨裝置一致性較好。低階 UI 雖需自行處理繪製與邏輯,但能完全掌控輸入體驗,繞過高階元件限制,適合簡單數字輸入場景。