2012-03-22 28 views
7

En mi aplicación cuatro TextArea está allí y quiero ingresar solo cuatro caracteres en un área de texto y el cursor se mueve automáticamente al siguiente área de prueba. Nuevamente, cuando ingreso cuatro caracteres en este TextArea, nuevamente el cursor se mueve automáticamente al siguiente TextArea.Java: cómo el cursor se mueve automáticamente de un campo de texto a otro

Ejemplo: Al momento de instalar Windows XP, quiere "Clave" y hay cuatro secciones cuando ingresa cuatro caracteres en la primera sección, luego el cursor se mueve automáticamente a la siguiente sección.

Lo mismo que quiero en mi aplicación.

Para ello en primer lugar agrego CustomizedTextFields.jar y luego crearon cuatro IntegerField:

private IntegerField text1; 
private IntegerField text2; 
private IntegerField text3; 
private IntegerField text4; 

después de este muestro todos estos IntegerField en mi cuadro.

Ahora yo probamos este código para enviar cursor al siguiente campo, pero que no está funcionando:

text1.addKeyListener(new KeyListener() { 
      @Override 
      public void keyTyped(KeyEvent e) { 
        int a2 = text1.getText().length(); 
        if (a2 == 3) { 
         text2.getCursor(); 
        } 
      } 

      @Override 
      public void keyReleased(KeyEvent e) { 
      } 

      @Override 
      public void keyPressed(KeyEvent e) { 
      } 
     }); 
+0

Para una mejor ayuda antes, publique un [SSCCE] (http://sscce.org/). –

Respuesta

10

pregunta bastante interesante intentar mejorar mis conocimientos en sombras del paquete de texto: -)

Hay dos requisitos separados aquí

  • restringir la longitud del texto: que se han hecho con un DocumentFilter como @mKorbel ya se ha señalado
  • automáticamente transferFocus al siguiente componente cuando se alcanza la longitud máxima: Resulta que se puede hacer con un NavigationFilter

en código:

JComponent panel = new JPanel(); 
final int maxSize = 3; 
for (int i = 0; i < 4; i++) { 
    final JTextField field = new JTextField(5); 
    NavigationFilter filter = new NavigationFilter() { 

     @Override 
     public void setDot(FilterBypass fb, int dot, Bias bias) { 
      if (dot >= maxSize) { 
       fb.setDot(0, bias); 
       field.transferFocus(); 
       return; 
      } 
      fb.setDot(dot, bias); 
     } 

     @Override 
     public void moveDot(FilterBypass fb, int dot, Bias bias) { 
      if (dot >= maxSize) { 
       fb.setDot(0, bias); 
       field.transferFocus(); 
       return; 
      } 
      fb.moveDot(dot, bias); 
     } 

    }; 
    field.setNavigationFilter(filter); 
    ((AbstractDocument) field.getDocument()).setDocumentFilter(new DocumentSizeFilter(maxSize)); 
    panel.add(field); 
} 

el documentFilter es el de la Swing Tutorial

+0

@Vinit Vikash y esta es la respuesta a su pregunta – mKorbel

+0

@kleopatra: +1 para NavigationFilter. De hecho, hasta hoy, este término no estaba en mi conocimiento :-). Sigo leyendo sobre esto, siento que lo que me dijeron es el camino a seguir, ya que esperaba que alguien pudiera aclarar más esto, por eso publiqué la respuesta, de lo contrario, nunca quise hacerlo. –

+0

Pero, cuando apliqué 'transferFocus()' dentro de 'NavigationFilter', nada cambió, así que si puede, publique todo el código, estaré realmente obligado. –

1

Reemplazar text2.getCursor() con text2.requestFocus().

getCursor() es para recuperar la forma del puntero del mouse al pasar el puntero sobre un componente.

Además, con este método todavía es posible ingresar más de 4 caracteres en un campo, por ejemplo, pegando desde el portapapeles. Si quieres bloquear eso, necesitarás verificar si el texto ingresado es más largo que 4 caracteres, y si es así, toma solo los primeros 4 caracteres del mismo.

1

Algo como esto debería funcionar:

text1.addKeyListener(new KeyAdapter(){ 
      public void keyPressed(KeyEvent e){ 
      String value=text1.getText(); 
      if(value.length()==4){ 
      text2.requestFocus(); 
      } 
} 

Dónde texto2 es su próximo campo de texto

+1

no use keyListeners en absoluto ... especialmente no para validar el ingreso de texto, en cambio vea la respuesta de @ mKorbel – kleopatra

6
At the time of installing Window XP it want "Key" and there are four section 
when you enter four character in first section then cursor automatically move 
to the next section. 
  1. añadir DocumentListener a la JTextComponents, para escuchar añadir DocumentFilter

  2. Don' t use KeyListener para JTextComponents, use sólo DocumentListener

  3. complemento requerido próxima JTextArea a la DocumentListener, si es que hay cuarto mecanografiado.Charlas en JTextArea,

  4. aviso, que se mueve con Focus de un JTextArea a otro sería mejor envuelto en invokeLater

2
import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 

public class NextBox extends JTextField { 
    private JComponent nextComponent; 


    public NextBox() { 
     addKeyListener(new KeyListener() { 

      @Override 
      public void keyTyped(KeyEvent e) {} 

      @Override 
      public void keyReleased(KeyEvent e) { 
       // Check for the four characters. 
       if (getText().length() >= 4) { 
        nextComponent.requestFocus(); 
       } 
      } 

      @Override 
      public void keyPressed(KeyEvent e) {} 
     }); 
    } 


    public static void main(String[] args) { 

     JFrame frame = new JFrame("Debug Frame"); 
     frame.setSize(400, 80); 
     frame.setLayout(new GridLayout(1,5)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     NextBox box1 = new NextBox(); 
     NextBox box2 = new NextBox(); 
     NextBox box3 = new NextBox(); 
     NextBox box4 = new NextBox(); 
     JButton button1 = new JButton("Done"); 

     box1.setNextComponent(box2); 
     box2.setNextComponent(box3); 
     box3.setNextComponent(box4); 
     box4.setNextComponent(button1); 

     frame.add(box1); 
     frame.add(box2); 
     frame.add(box3); 
     frame.add(box4); 
     frame.add(button1); 

     frame.setVisible(true); 
    } 

    /** 
    * @param nextComponent the nextComponent to set 
    */ 
    public void setNextComponent(JComponent nextComponent) { 
     this.nextComponent = nextComponent; 
    } 

    /** 
    * @return the nextComponent 
    */ 
    public JComponent getNextComponent() { 
     return nextComponent; 
    } 
} 
+0

no use keyListeners en absoluto ... especialmente no para validar el ingreso de texto, en cambio vea la respuesta de @ mKorbel. Y no agregue acoplamiento innecesario: en lugar de hard-coding nextComponent, llame a transferFocus en el actual – kleopatra

+0

Hola, gracias por los comentarios. Si no te importa, ¿por qué debería evitar keyListeners? ¿Hay una respuesta simple? Gracias – Reg

+1

@reg: en Swing intentamos hacer [KeyBinding] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html), y además, siempre preferimos 'requestFocusInWindow()' over ' requestFocus() ', Además, siempre intente usar' tArea.getDocument(). getLength() 'sobre' tArea.getText(). length() ':-) –

0

simplemente crear área de texto e ir a eventos clave mecanografiadas den u puede escribir este

String number=jTextArea1.getText(); 
int l=number.length(); 
if(l==3){ 
jTextArea1.transferFocus(); 

} 
Cuestiones relacionadas