Categories: Java | How To | Code Examples | UI
This page was last modified 18:14, 11 April 2008.
J2ME Custom Text Input
From Forum Nokia Wiki
Here is a sample Midlet: Media:CustomInputMidlet.zip
Here is a basic example showing how to create a custom text input using J2me and Canvas, things that is often needed when using low level graphics (e.g. for games).
In this code, you can:
- define which characters map to each key
- define blinking interval
- define max interval between subsequent key presses
- move left/right within the text
- delete text
A lot of features are missing, so if you want to implement them you're welcome :)
package com.jappit.custominput.screen; import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Font; import javax.microedition.lcdui.Graphics; public class CustomInputCanvas extends Canvas implements Runnable { static final char[] KEY_NUM1_CHARS = new char[]{'.', '?', '!'}; static final char[] KEY_NUM2_CHARS = new char[]{'a', 'b', 'c'}; static final char[] KEY_NUM3_CHARS = new char[]{'d', 'e', 'f'}; static final char[] KEY_NUM4_CHARS = new char[]{'g', 'h', 'i'}; static final char[] KEY_NUM5_CHARS = new char[]{'j', 'k', 'l'}; static final char[] KEY_NUM6_CHARS = new char[]{'m', 'n', 'o'}; static final char[] KEY_NUM7_CHARS = new char[]{'p', 'q', 'r', 's'}; static final char[] KEY_NUM8_CHARS = new char[]{'t', 'u', 'v'}; static final char[] KEY_NUM9_CHARS = new char[]{'w', 'x', 'y', 'z'}; static final char[] KEY_NUM0_CHARS = new char[]{' '}; int clearKeyCode = Integer.MIN_VALUE; StringBuffer currentText = new StringBuffer(); String currentString = new String(); int lastPressedKey = Integer.MIN_VALUE; int currentKeyStep = 0; Font inputFont = null; int inputWidth = 0; int inputHeight = 0; int inputTranslationX = 0; long lastKeyTimestamp = 0; long maxKeyDelay = 500L; int caretIndex = 0; int caretLeft = 0; boolean caretBlinkOn = true; long caretBlinkDelay = 500L; long lastCaretBlink = 0; boolean goToNextChar = true; public CustomInputCanvas() { new Thread(this).start(); inputFont = Font.getDefaultFont(); inputWidth = getWidth(); inputHeight = inputFont.getHeight(); } public char[] getChars(int key) { switch(key) { case Canvas.KEY_NUM1: return KEY_NUM1_CHARS; case Canvas.KEY_NUM2: return KEY_NUM2_CHARS; case Canvas.KEY_NUM3: return KEY_NUM3_CHARS; case Canvas.KEY_NUM4: return KEY_NUM4_CHARS; case Canvas.KEY_NUM5: return KEY_NUM5_CHARS; case Canvas.KEY_NUM6: return KEY_NUM6_CHARS; case Canvas.KEY_NUM7: return KEY_NUM7_CHARS; case Canvas.KEY_NUM8: return KEY_NUM8_CHARS; case Canvas.KEY_NUM9: return KEY_NUM9_CHARS; case Canvas.KEY_NUM0: return KEY_NUM0_CHARS; } return null; } boolean isClearKey(int key) { return key == -8; } void clearChar() { if(currentText.length() > 0 && caretIndex > 0) { caretIndex--; currentText.deleteCharAt(caretIndex); currentString = currentText.toString(); } } void updateCaretPosition() { caretLeft = inputFont.substringWidth(currentString, 0, caretIndex); if(caretLeft + inputTranslationX < 0) { inputTranslationX = - caretLeft; } else if(caretLeft + inputTranslationX > inputWidth) { inputTranslationX = inputWidth - caretLeft; } } public void keyPressed(int key) { int gameAction = getGameAction(key); System.out.println("KEY: " + key + ", " + gameAction); if(isClearKey(key)) { clearChar(); updateCaretPosition(); goToNextChar = true; } else if(key >= KEY_NUM0 && key <= KEY_NUM9) { writeKeyPressed(key); } else if(gameAction == Canvas.LEFT) { if(caretIndex > 0) { caretIndex--; updateCaretPosition(); goToNextChar = true; } } else if(gameAction == Canvas.RIGHT) { if(caretIndex < currentText.length()) { if(goToNextChar) caretIndex++; updateCaretPosition(); goToNextChar = true; } } } public void writeKeyPressed(int key) { if(goToNextChar || key != lastPressedKey) { goToNextChar = true; lastPressedKey = key; currentKeyStep = 0; } else { currentKeyStep++; } char[] chars = getChars(key); if(chars != null) { if(currentKeyStep >= chars.length) { currentKeyStep -= chars.length; } if(goToNextChar) { currentText.insert(caretIndex, chars[currentKeyStep]); caretIndex++; } else { currentText.setCharAt(caretIndex - 1, chars[currentKeyStep]); } currentString = currentText.toString(); updateCaretPosition(); lastKeyTimestamp = System.currentTimeMillis(); goToNextChar = false; } } public void checkTimestamps() { long currentTime = System.currentTimeMillis(); if(lastCaretBlink + caretBlinkDelay < currentTime) { caretBlinkOn = !caretBlinkOn; lastCaretBlink = currentTime; } if(!goToNextChar && lastKeyTimestamp + maxKeyDelay < currentTime) { goToNextChar = true; } } public void run() { while(true) { checkTimestamps(); repaint(); try { synchronized(this) { wait(50L); } } catch(Exception e) { e.printStackTrace(); } } } public void paint(Graphics g) { g.setFont(inputFont); g.setColor(0xffffff); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(0x000000); g.translate(inputTranslationX, 0); g.drawString(currentString, 0, 0, Graphics.LEFT | Graphics.TOP); if(caretBlinkOn && goToNextChar) { g.drawLine(caretLeft, 0, caretLeft, inputHeight); } g.translate(- inputTranslationX, 0); } }
| Related Discussions | ||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| *PN WAP/WML mask on input field | nekar | Browsing and Mark-ups | 7 | 2007-01-15 23:38 |
| Predictive text entry in j2me | jai99 | Mobile Java General | 1 | 2005-01-18 14:04 |
| Text input Series 60 | fmhunter | Mobile Java General | 1 | 2003-02-10 21:31 |
| Input fields not cleared | Nokia_Archive | Browsing and Mark-ups | 1 | 2002-05-15 12:27 |
| Input text dialog? | JTOne | Symbian User Interface | 10 | 2007-11-28 07:51 |
