2010-12-03 11 views

Respuesta

6

Utilice VerifyListener y rechace los caracteres según la entrada del usuario.

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

public class Test { 

    public static void main(String[] args) { 
     Display display = new Display(); 
     Shell shell = new Shell(display); 

     final Text text = new Text(shell, SWT.BORDER); 
     text.addVerifyListener(new VerifyListener() { 

      @Override 
      public void verifyText(VerifyEvent e) { 
       // allows cut (CTRL + x) 
       if (e.text.isEmpty()) { 
        e.doit = true; 
       } else if (e.keyCode == SWT.ARROW_LEFT || 
          e.keyCode == SWT.ARROW_RIGHT || 
          e.keyCode == SWT.BS || 
          e.keyCode == SWT.DEL || 
          e.keyCode == SWT.CTRL || 
          e.keyCode == SWT.SHIFT) { 
        e.doit = true; 
       } else { 
        boolean allow = false; 
        for (int i = 0; i < e.text.length(); i++) { 
         char c = e.text.charAt(i); 
         allow = Character.isDigit(c) || Character.isWhitespace(c); 
         if (! allow) { 
          break; 
         } 
        } 
        e.doit = allow; 
       } 

      } 
     }); 
     text.setSize(200, 20); 
     shell.pack(); 
     shell.open(); 
     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) 
       display.sleep(); 
     } 
     display.dispose(); 
    } 
} 
+0

gracias por la solución - incluso se puede embellecer este SWT.BS utilizar para keyCode 8. – Gregor

+0

Ésta es una solución horrible! No funciona para pegar. No funciona para eliminar-clave. ¿Para qué más no funciona? Difícil de decir. – Lii

+0

@Lii Acabo de actualizar la solución para admitir ctrl + x, ctrl + v y la tecla DEL. – ozhan

0

En Swing tiene un JFormattedTextField que hará exactamente eso. Pero no creo que haya algo similar en SWT. Debería poder hacer algunos cambios para incluir un JFormattedTextField si eso es realmente lo que necesita. Otra opción sería simplemente validar la entrada del usuario después de que escriben.

2

Establecer un VerifyListener en el control de texto que comprueba que el texto insertado contiene sólo dígitos.

Esto funciona mucho mejor que las soluciones que utilizan códigos de clave. Como funciona en la entrada, no bloquea operaciones como pegar y eliminar.

Ejemplo:

text.addVerifyListener(new VerifyListener() { 
    @Override 
    public void verifyText(VerifyEvent e) { 
      for (int i = 0; i < e.text.length(); i++) { 
       if (!Character.isDigit(e.text.charAt(i))) { 
        e.doit = false; 
        return; 
       } 
      } 
     } 
    }); 
Cuestiones relacionadas