2009-09-15 14 views
32

He creado un formulario usando Swing en Java. En el formulario he usado un campo de texto en el que tengo que establecer el foco cada vez que presiono la tecla. ¿Cómo establecer el foco en un componente en particular en Java?¿Cómo se establece un foco en Textfield en Swing?

+1

10 preguntas, ninguno de ellos respuestas aceptadas ... –

Respuesta

73

¿Le daría lo que necesita? Component.requestFocus()

+0

Gracias, déjame ver si me funciona o no –

+8

Me tomó cinco minutos encontrarlo ... tanto para la búsqueda "simple" :-(- ah bueno, los documentos API de Java no son un modelo de claridad de todos modos :-) – Joey

+3

FYI, los [javadocs para JComponent] (http://docs.oracle.com/javase/7/docs/api/index.html) dicen de 'requestFocus()', "uso de esto método se desaconseja porque su comportamiento depende de la plataforma. recomendamos el uso de [requestFocusInWindow()] (http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#requestFocusInWindow()). Si desea obtener más información sobre el enfoque, consulte [Cómo utilizar el Subsistema de enfoque] (http://java.sun.com/docs/books/tutorial/uiswing/misc/focus.html), una sección en The Java Tutorial. . " –

13

Ahora que hemos buscado en la API, todo lo que tenemos que hacer es leer la API.

De acuerdo con la documentación de la API:

"Debido a que el comportamiento del foco de este método es dependiente de la plataforma, desarrolladores se recomienda encarecidamente a uso requestFocusInWindow cuando posible."

21

Esto funcionaría ..

SwingUtilities.invokeLater(new Runnable() { 

public void run() { 
     Component.requestFocus(); 
    } 
}); 
3

Tenga en cuenta que todo lo anterior falla por algún motivo en JOptionPane. Después de mucho ensayo y error (más de lo anteriormente planteado 5 minutos, de todos modos), esto es lo que finalmente funcionó:

 final JTextField usernameField = new JTextField(); 
// ... 
     usernameField.addAncestorListener(new RequestFocusListener()); 
     JOptionPane.showOptionDialog(this, panel, "Credentials", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, null, null); 


public class RequestFocusListener implements AncestorListener { 
    @Override 
    public void ancestorAdded(final AncestorEvent e) { 
     final AncestorListener al = this; 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       final JComponent component = e.getComponent(); 
       component.requestFocusInWindow(); 
       component.removeAncestorListener(al); 
      } 
     }); 
    } 

    @Override 
    public void ancestorMoved(final AncestorEvent e) { 
    } 

    @Override 
    public void ancestorRemoved(final AncestorEvent e) { 
    } 
} 
+1

gracias por esta solución. Esta es la única manera funcionó. – MyPasswordIsLasercats

3

Usted puede usar también JComponent.grabFocus(); es el mismo

+0

Javadoc para [JComponent.grabFocus()] (http://docs.oracle.com/javase/8/docs/api/javax/swing/JComponent.html#grabFocus--) establece explícitamente que este método debería no ser utilizado por el código del cliente y sugiere utilizar el método 'requestFocusInWindow()', que ya se menciona en otras respuestas. –

Cuestiones relacionadas