Listener t nicht so richtig

schuetzejanett

Erfahrenes Mitglied
hallo,

habe in meinem SWT porg eine Combobox, in diese kann ich auch werte eingeben. Allerdings möchte ich die eingegebenen werte auch auf gültigkeit testen.
Dafür habe ich beides probiert einen verifylistener und einen modifyListener. Doch beides funktioniert nicht so wie ich will.
Denn sie testen nach Eingabe eines zeiches und nicht nach eingabe des ausdrucks, da ich den test auf gültigkeit mit text.matches(regex) ausführe kommt so erst 3-4 mal falsch eh ein richtig kommt. Und das obwohl der ausdruck richtig eingegeben wird. Außerdem werden die methoden auch schon beim füllen der combocox aufgerufen und sind selbst da manchmal falsch ob weohl nur richtige werte eingelesen werden hier. mal der code.

Java:
comboPostage.addModifyListener(new ModifyListener()
		{
			@Override
			public void modifyText(ModifyEvent e)
			{

				System.out.println("jetzt: " + e.toString());
				Combo text = (Combo) e.widget;
				String value = text.getText();
				if (!value.matches("\\d[\\,\\.]\\d{2}"))
				{
					System.out.println("passt nicht");
					text.select(1);
				}			
			}
		});

comboPostage.addVerifyListener(new VerifyListener()
		{

			@Override
			public void verifyText(VerifyEvent e)
			{
				if (!e.text.matches("\\d[\\,\\.]\\d{2}"))
				{
					e.doit = false;
					System.out.println("passt nicht verify");
				}
			}

		});

was kann ich machen das es funktioniert also das nach der eingabe mit dem regex getestet wird und wenn der wert nicht stimmt, das feld geleert wird oder der zuvor den focushabende wert wieder angezeigt wird?
 
Zuletzt bearbeitet von einem Moderator:
Du könntest es mit nem FocusListener probieren und die beim erlangen des Focus den Wert speichern und beim verlassen prüfen und ggfs zurücksetzen. Problematisch ist dies nur wenn es möglich ist eine Maske zu verlassen ohne dass das Feld den Fokus verliert.
 
Ich habe es jetzt so gelöst das ich nach. nach der eingabe püfe ob das zeichen gültig ist oder nicht. Gültig ist alles in der Form 3,45. Dabei können die Zahlen beiliebig sein und auch das Komma kann durch Punkt ersetzt werden.

Also ich habe es jetzt so gelöst: Als erstes schaue ich ob das event ein oder mehr zeichen hat. Ein zeichen bedeuted das ich in die Combobox was eingegeben habe und mehrere Zeichen bedeuten das ich ein element ausgewählt habe.

Bei einem Zeichen unterscheide ich dann wieviele zeichen in dem Textfeld der Combobox schon stehen: Bei 1 folgt jetzt der punkt oder das komma. Dann sag ich alles andere ist falsch und ansonsten teste ich ob das zeichen eine zahl ist. backspace ist in beiden Fällen auch erlaubt.
Und in dem Fall das ich ein Element auswählt, teste ich ob der gesamte reguläre Ausdruck passt.

Auf der combobox ist ein Textlinit von 4 gesetzt.

Also es geht zwar nur bin ich nicht so wirklich zufrieden damit.
Denn falls ich der gültige Zahlenbereich vergrößert ist nur mit hohem aufwand änderbar, vorallem wenn ein anderer Programmierer die Änderungen durchführen sollte.
Naja also meine damit das ein anderer diese Lösung verstehen und dann halt anpassen muss.

Hat jemand ne idee wie ich folgenden code noch verbessern könnte, oder auch eine andere Idee das ganze zu lösen?

Java:
		comboPostage.addListener(SWT.Verify, new Listener()
		{
			public void handleEvent(Event e)
			{
				Combo text = (Combo) e.widget;
				// then: eingabe else: auswahl eines elements der liste				
if (e.text.length() == 1)
				{
					//the size of the chars in the textfield
					int length = text.getText().length();
					switch (length)
					{
						//erlaubt . , und backspace
						case 1:
							e.doit = (e.text.matches("[\\,\\.]") || (e.character == '\b'));
							return;
						//erlaubt zahlen backspace
						default:
							e.doit = (e.text.matches("\\d") || (e.character == '\b'));
							return;
					}
				} else
				{
					e.doit = (e.text.matches("\\d[\\,\\.]\\d{2}") || (e.character == '\b'));
					return;
				}
			}
		});
 
Zuletzt bearbeitet:
Ehrlich gesagt habe ich wenig Lust mir einen Beitrag durchzulesen der mit Rechtschreibung, Grammatik und Zeichensetzung nicht viel zu tun hat. Du schreibst doch sonst nicht so furchtbar....

Beim Matcher gibts auf jeden Fall noch lookingAt womit man auch eine Teilsequenz matchen kann.
 
Also habe jetzt den beitrag von heut nachmittag noch mal etwas geändert, hoffe er klingt jetzt besser und verständlich.
Habe beim lesen selberbemerkt das er grausam geschrieben war.

Also mit dem lookingAt das schaue ich mir morgen noch mal an, ob mir das hilft meinen Code zu verbessern, bzw leichter anpassen zu könnnen. Für sonstige Vorstellungen bin ich gerne offen. Denn ich wollte schon versuchen Code zu schreiben, den auch ein Dritter versteht und ändern bzw. anpassen kann. Und das denke ich habe ich mit dem Code noch nicht geschafft.
 
Zurück