SWT - Im Textfeld nur Numeric Eingaben erlauben

RipdEaTh

Mitglied
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?


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
 
Hab jetzt eine Lösung gefunden, die zu klappen scheint.. Das Feld akzeptiert nur Zahlen und reagiert weiterhin auf Backspace und sowas..

Hier mal der Codeschnipsel


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) { }
	});
 
Hallo!

Schau mal hier:
Java:
/**
 * 
 */
package de.tutorials;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

/**
 * @author Thomas.Darimont
 */
public class SWTTextInputVerificationExample {

  /**
   * @param args
   */
  public static void main(String[] args) {

    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setLayout(new RowLayout());
    Text text = new Text(shell, SWT.NONE);
    text.addVerifyListener(new VerifyListener() {
      public void verifyText(VerifyEvent e) {
        if (!Character.isDigit(e.character) && !Character.isISOControl(e.character)) {
          e.doit = false;
        }
      }
    });

    shell.pack();
    shell.open();

    while (!shell.isDisposed()) {
      if (!display.readAndDispatch()) {
        display.sleep();
      }
    }
  }
}
Wenn du JFace verwenden würdest könntest du sogar noch ein paar schicke Feld-Dekorationen anzeigen lassen:
http://www.eclipsezone.com/eclipse/forums/t83555.html

Gruß Tom
 
Hi!

Jetzt habe ich noch das Problem, dass man per Copy und Paste was in das Feld einfügen kann, ohne das es geprüft wird..

Am einfachsten wäre es, Copy und Paste einfach auf dem Feld zu deaktivieren. Wie könnte man das am besten umsetzen? Wird ja sicher mit dem ModifyEvent laufen..
 
Hallo!

Schau mal hier:
Java:
/**
 * 
 */
package de.tutorials;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

/**
 * @author Thomas.Darimont
 */
public class SWTTextInputVerificationExample {

  /**
   * @param args
   */
  public static void main(String[] args) {

    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setLayout(new RowLayout());
    Text text = new Text(shell, SWT.NONE);
    text.addVerifyListener(new VerifyListener() {
      public void verifyText(VerifyEvent e) {
        e.doit = e.text.matches("\\d*");
      }
    });

    shell.pack();
    shell.open();

    while (!shell.isDisposed()) {
      if (!display.readAndDispatch()) {
        display.sleep();
      }
    }
  }
}

Gruß Tom
 
Hi!

Danke für deine Lösungsvorschläge..
Habe das jetzt wie folgt umgesetzt..
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:

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

Code:
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;
}
 
Zurück