# SWT - Im Textfeld nur numerische Eingaben erlauben



## RipdEaTh (2. Nov 2006)

Hi Leute!

Ich stehe gerade vor einem kleinen Rätsel. Für das oben geschilderte Problem gibt es in Swing und AWT genug Lösungsvorschläge und Ansätze.

Da meine Anwendung aber in SWT läuft, kann ich von diesen Vorschlägen leider keinen umsetzen.
Nun meine Frage an euch, habt ihr bereits schonmal solch ein Problem gelöst oder habt ihr eine Idee, wie man das ganze umsetzen könnte?

Beispielweise gibts compose vom KeyEvent in SWT nicht.. Was genau macht compose eigentlich? Vll könnte man diese Methode selbst erstellen.


Ich habe n bissl rumprobiert.. Habe bisher keinen richtigen Erfolg gehabt. Ich möchte, dass man in einem Textfeld nur Zahlen eingeben kann und das alle anderen Zeichen garnicht erst im Textfeld dargestellt werden.

Ich könnte per Keylistener den Inhalt des Textfeldes auch untersuchen und alle nicht numerischen Zeichen rauswerfen, aber das sieht blöde aus.

Habt ihr da eine andere Lösung für mich?

Würde mich über eine Antwort freuen.

LG


----------



## blue_head (2. Nov 2006)

```
control.addListener(SWT.Modify, new Listener() {
				public void handleEvent(Event event) {
					value = event.text;
					if(!validate(value)){
                                                event.doit = false;						
						return;
					}					
				}
			});
```

die Funktion validate prüft dann, ob der eingegebene Text nur Ziffern enthält...

Vielleicht hast Du ne Idee für mein Refresh-Problem?
http://www.java-forum.org/de/viewtopic.php?p=231336#231336


----------



## RipdEaTh (2. Nov 2006)

Hi!

Danke für die schnelle Antwort. 
Inzwischen habe ich eine Möglichkeit gefunden, wo man auch trotzdem noch Backspace benutzen kann, etc.

Hier mal der Code

```
tPort.addKeyListener(new KeyListener() {
	public void keyPressed(KeyEvent arg0) { 
		char key = arg0.character;
			if (!Character.isDigit(key) && !Character.isISOControl(key))
				arg0.doit = false;
	}
	public void keyReleased(KeyEvent arg0) { }
	});
```


----------



## blue_head (2. Nov 2006)

...hmmm. Was ist, wenn der Nutzer den Text per Drag and Drop mit der Maus einfügt? ;-)


----------



## blue_head (2. Nov 2006)

ansonsten bietet sich das Spinner-Widget an...


----------



## RipdEaTh (2. Nov 2006)

Joah da bin ich auch schon drauf gekommen ^^ Überleg mir grad, wie man das umgehen kann.. 

Würde da sonst einfach Copy&Paste auf dem Feld deaktivieren, wenn ich wüsste wie ^^


----------



## blue_head (2. Nov 2006)

...dann mit dem Modify-Event arbeiten...


----------



## byte (2. Nov 2006)

Ich würdn Spinner nehmen. Dafür sind die schließlich da.


----------



## RipdEaTh (2. Nov 2006)

Die Eingabe eines Ports über einen Spinner ist ein wenig umständlich


----------



## byte (2. Nov 2006)

Wieso? Du kannst in nem Spinner per Default auch Zahlen eintippen, anstatt die Pfeile zu benutzen.


----------



## RipdEaTh (2. Nov 2006)

Naja, nun hab ich das Problem wiefolgt gelöst:

Ich habe nur noch einen VerifyListener auf dem Textfeld.
Sobald eine Änderung passiert, ruft dieser die Methode checkInput(String) mit der Klassenvariable text des Events auf, und prüft jedes Zeichen des Inputs durch. Sobald eines der Zeichen keine Zahl bzw. kein Steuerzeichen ist, wird das Paste abgebrochen, ansonsten wird der Text eingefügt.

Hier mal der Code:


```
tPort.addVerifyListener(new VerifyListener() {
	public void verifyText(VerifyEvent e) {
		if (!checkInput(e.text)) e.doit = false;
 	}
});
```


```
private boolean checkInput(String inInput) {
	int inputLength = inInput.length();
	for (int i=0; i<inputLength; i++) {
		char key = inInput.charAt(i);
    		if (!Character.isDigit(key) && !Character.isISOControl(key))
    			return false;
    	}
	return true;
}
```


----------

