# SWT Textfeld und Verifylistener



## nettchen (5. Jul 2007)

hallo hatte zuerst im Anfängerforum gepostet mit dem ergebenis das es an höchstwahrscheinlich am SWT lieht.
Möchte in einem Textfeld nur zahlen und den . und den Backspace gelten lassen.

Hier ist der Link zu dem anderen Thread http://www.java-forum.org/de/viewtopic.php?p=311902#311902

Hier noch mal mein beispielprogram, mit nur einem textfeld, was aber über die gleiche funktion verfügen soll. Dabei kann ich aber aktuell nur zahlen eingeben und weder den . nach die backspace taste zum löschen benutzen.


```
package testverify; 

import org.eclipse.swt.layout.GridLayout; 
import org.eclipse.swt.events.VerifyEvent; 
import org.eclipse.swt.events.VerifyListener; 
import org.eclipse.swt.graphics.Point; 
import org.eclipse.swt.widgets.Shell; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Text; 
import org.eclipse.swt.SWT; 

public class testClass { 

   private Shell sShell = null; 
   private Text textPostage = null; 

   /** 
    * @param args 
    */ 
   public static void main(String[] args) { 
       
      Display display = Display.getDefault(); 
      testClass thisClass = new testClass(); 
      thisClass.createSShell(); 
      thisClass.sShell.open(); 

      while (!thisClass.sShell.isDisposed()) { 
         if (!display.readAndDispatch()) 
            display.sleep(); 
      } 
      display.dispose(); 
   } 

   /** 
    * This method initializes sShell 
    */ 
   private void createSShell() { 
      sShell = new Shell(); 
      sShell.setText("Shell"); 
      sShell.setSize(new Point(300, 200)); 
      sShell.setLayout(new GridLayout()); 
      textPostage = new Text(sShell, SWT.BORDER); 
      textPostage.setTextLimit(5); 
      textPostage.addVerifyListener(new VerifyListener() 
       {      
         public void verifyText(VerifyEvent e) 
         {        
             
             e.doit = e.text.matches("\\d{1,2}\\.?\\d{0,2}"); 
         }    
      }); 
   }       
}
```

Sieht jemand einen fehler bzw. kann das programm mal testen


----------



## schuetzejanett (5. Jul 2007)

hallo keiner ne idee was an dem regEx falsch ist?

Hab nämlich ein ähnliches problem, was ich bisher immer hinterher durch umständliches austesten gelöst habe, diese lösung würde mir aber auch besser gefallen


----------



## nettchen (6. Jul 2007)

Hallo, 
vermute es liegt daran das beim verify listener bei jedem tastendruck geprüft wird und es deshalb zu einem RegEx fehler kommt, weiß aber leider nicht wie ich das ganze umgehen kann.


----------



## madboy (6. Jul 2007)

Mir fällt gerade doch was ein.

```
public void verifyText(VerifyEvent e) {
        switch (e.text.length()) {
        case 1:
            e.doit = e.text.matches("\\d");
            break;
        case 2:
            e.doit = e.text.matches("\\d+");
            break;
        case 3:
            e.doit = e.text.matches("\\d{2}\\.");
            break;
        case 4:
            e.doit = e.text.matches("\\d{2}\\.\\d");
            break;
        case 5:
            e.doit = e.text.matches("\\d{2}\\.\\d{2}");
            break;
        default:
            break;
        }
```


----------



## nettchen (6. Jul 2007)

danke für die idee jetzt geht zwar die backspace taste aber immer noch nicht der Punkt


----------



## madboy (6. Jul 2007)

Mist. Habe nur an "33.2" aber nicht an "3.22" gedacht... Das Ganze wird irgendwie immer größer. Da gibts bestimmt noch was eleganteres.
Aber bis jemandem was einfällt sollte das jetzt klappen:

```
...
        case 2:
            e.doit = e.text.matches("\\d+|\\d\\.");
            break;
        case 3:
            e.doit = e.matches("\\d{2}\\.|\\d\\.\\d");
            break;
        case 4:
            e.doit = e.matches("\\d{2}\\.\\d|\\d\\.\\d{2}");
            break;
...
```


----------



## nettchen (6. Jul 2007)

Nein funktioniert leider immer noch nicht, gibt es denn eine variante wenn man ubahängig von der länge nur prüft ob es ein punkt oder eine zahl ist?


----------



## madboy (6. Jul 2007)

> ...ubahängig von der länge...


Ich dachte, du willst die Länge mit einbeziehen.

Nur auf Punkte und Zahlen testen:
Ohne Regex

```
String text = "123..321...2";
       char c = text.charAt(text.length() - 1); //letztes Zeichen im String
       if(Character.isDigit(c)) {

       } else if(c == '.') {

       } else {

       }
```

Mit Regex

```
String text = "1..23..123";
       
       if(text.matches("[\\d\\.]+")) { //kompletten String matchen
       }
```

Falls das auch nicht klappt, gehen mir die Ideen aus.


----------



## nettchen (6. Jul 2007)

ja will ich ja eigentlich auch aber das scheint bei swt mit dem verifylistener ja nicht so recht zu klappen.

So geht es abgesehen davon das backspace noch nicht geht, was muss ich dafür noch ergänzen?


----------



## madboy (6. Jul 2007)

Schau mal hier ganz unten: http://www.eclipsezone.com/eclipse/forums/t60539.html

Edit: allgemeiner hier: http://www.eclipse.org/swt/snippets/. Suche nach "verify"


----------



## nettchen (6. Jul 2007)

Danke für den tipp, habe es jetzt so gelöst also bis auf das ich hinterher noch prüfen muss ob es dem scham entspricht funzt es jetzt


```
e.doit = (e.text.matches("[\\d\\.]+") || (e.character == '\b') );
```


----------



## nettchen (6. Jul 2007)

scham = schema


----------

