[Solved] EditField with StringBuilder

I have an editfield and the user can manipulate the pointer with arrow keys to insert or delete text at every character. My only problem is that I get [icode]StringIndexOutOfBoundsException[/icode]s and I don’t know how I can fix them.

Where I take a key and insert it in a StringBuilder object called input:

@Override
	public void key(int keycode) {
		if (isLocked()) {
			return;
		}
		Keyboard.poll();
		boolean shift = Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) || InputSystem.getSystem().CAPS_LOCK;
		String key = getKey(keycode, shift);
		boolean pointerShift = keycode == Keyboard.KEY_LEFT || keycode == Keyboard.KEY_RIGHT;
		if (!active) {
			return;
		}
		if (keycode == Keyboard.KEY_BACK) {
			input.deleteCharAt(pointer - 1);
			pointer--;
		} 
		else if(keycode == Keyboard.KEY_DELETE){
			input.deleteCharAt(pointer);
		}
		else {
			if (pointerShift) {
				if (keycode == Keyboard.KEY_LEFT) {
					pointer = Math.max(0, pointer - 1);
				} else {
					pointer = Math.min(input.length(), pointer + 1);
				}
			} else {
				input.insert(pointer, key);
				pointer++;
			}
		}
 	}

Any thoughts?

CopyableCougar4

I guess I solved my own issue.

@Override
	public void key(int keycode) {
		if (isLocked()) {
			return;
		}
		Keyboard.poll();
		boolean shift = Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) || InputSystem.getSystem().CAPS_LOCK;
		String key = getKey(keycode, shift);
		boolean pointerShift = keycode == Keyboard.KEY_LEFT || keycode == Keyboard.KEY_RIGHT;
		if (!active) {
			return;
		}
		if (keycode == Keyboard.KEY_BACK) {
			input.deleteCharAt(Math.min(input.length() - 1, pointer - 1));
			pointer--;
		} 
		else if(keycode == Keyboard.KEY_DELETE){
			input.deleteCharAt(Math.min(input.length() - 1, pointer));
		}
		else {
			if (pointerShift) {
				if (keycode == Keyboard.KEY_LEFT) {
					pointer = Math.max(0, pointer - 1);
				} else {
					pointer = Math.min(input.length(), pointer + 1);
				}
			} else {
				input.insert(Math.max(0, Math.min(input.length(), pointer)), key);
				pointer++;
			}
		}
 	}

Just an issue with offsetting the removal by one character :slight_smile:

CopyableCougar4