2011-01-09 19 views
12

Tengo una aplicación desarrollada en netbeans y quiero establecer el foco en un cierto jTextField cuando se muestra un panel. He leído varias publicaciones y he intentado varios métodos, pero no han funcionado. Uno de los principales problemas es dónde colocar el código requerido, que creo que en mi caso es this.txtMessage.requestFocusInWindow();Establecer el foco en un campo de texto

Hay algunas publicaciones que indican que se utiliza un Oyente de Ventana, sin embargo, como netbeans ha generado la GUI, no veo cómo implementar las interfaces ya que no puedo editar el código que crea el jPANEL, etc. Todo esto es muy frustrante y realmente no creo que esto sea tan difícil.

Al igual que una prueba agregué el requestFocusInWindow(); a un botón en el panel y estableció el foco en la entrada deseada.

+1

Debe usar la generación de código NetBeans, ya que a menudo es mucho más fácil hacerlo en proyectos Swing creados a mano. Personalmente, esta es una de las razones por las que creo que la creación de complejos proyectos de Swing con generadores de código, como a través de Matisse de NetBean, es mucho más difícil que crear código a mano. –

Respuesta

15

he tenido un escenario similar, donde Necesitaba centrarme en un cuadro de texto dentro de un panel cuando se mostraba el panel. El panel se cargó al inicio de la aplicación, por lo que no pude establecer el foco en el constructor. Como el panel no se cargaba o no se enfocaba en el programa, esto significaba que no tenía evento para lanzar la solicitud de enfoque.

Para resolver esto, agregué un método global a mi principal que llamaba a un método en el panel que invocaba requestFocusInWindow() en el área de texto. Puse la llamada al método global en el botón que mostró el panel, después de la llamada a mostrar. Esto significaba que se mostraría el panel y luego el área de texto asignó el foco después de mostrar el panel. Espero que tenga sentido y ayude!

Además, puede editar la mayor parte del código generado automáticamente haciendo clic derecho en el objeto en la vista de diseño y seleccionando personalizar el código, sin embargo, no creo que le permita editar paneles.

10

No estoy seguro de si me falta algo aquí, pero no hay ninguna razón por la que no pueda agregar un oyente a su panel.

En Netbeans, simplemente presione el botón "Fuente" en la esquina superior izquierda de la ventana del editor y podrá editar la mayor parte del código. El código de diseño real está en su mayoría bloqueado, pero incluso puedes personalizarlo si es necesario.

Por lo que sé, txtMessage.requestFocusInWindow() se supone que configura el enfoque predeterminado para cuando la ventana se muestra la primera vez. Si desea solicitar el foco después de la ventana ya se ha mostrado, se debe utilizar txtMessage.requestFocus()

Para las pruebas, sólo se puede añadir un detector en el constructor:

addWindowListener(new WindowAdapter(){ 
    public void windowOpened(WindowEvent e){ 
    txtMessage.requestFocus(); 
    } 
}); 
+1

No debe usar requestFocus(). Lee la descripción de API para ese método. requestFocusInWindow() es el método adecuado para usar. – camickr

+0

Hola Riaan y gracias por la respuesta, el problema es con un JPanel que tiene un jTextField en el que quiero enfocarme. La ventana principal carga el JPanel como y cuando lo necesita, txtMessage.requestFocus() no tiene ningún efecto. y agregar un oyente de ventana en la ventana principal parece una pérdida de tiempo, ya que carga un número de JPanel no solo el que tiene el campo de texto, etc. – Lee

3

En un JFrame o JDialog siempre puede sobrescribir el método setVisible(), funciona bien. No lo he probado en un JPanel, pero puede ser una alternativa.

@Override 
public void setVisible(boolean value) { 
    super.setVisible(value); 
    control.requestFocusInWindow(); 
} 
0

Para mí la forma más fácil de conseguir que funcione, es poner la línea component.requestFocus();, después de la línea setVisible(true);, en la parte inferior de su marco o panel constructor.

Esto probablemente tiene algo que ver con pedir el enfoque, después de que se hayan creado todos los componentes, porque la creación de un nuevo componente, después de solicitar la solicitud de enfoque, hará que su componente se desconecte y haga que el foco vaya a su componente recién creado. Al menos, eso es lo que supongo.

1

He jugado con esto para siempre, ¡y finalmente encontré algo que parece funcionar siempre!

textField = new JTextField() { 

     public void addNotify() { 
      super.addNotify(); 
      requestFocus(); 
     } 
    }; 
0

Ninguna de las anteriores trabajó para mí, porque mi ventana es una JPopupMenu.

Lo que hizo el trabajo fue la siguiente:

addAncestorListener(new AncestorListener() { 
    @Override 
    public void ancestorAdded(AncestorEvent ae) { 
     myEdit.requestFocus(); 
    } 

    // ... other ancestor listener methods 
} 
0

lo hice mediante el establecimiento de un evento AncesterAdded en el campo de texto y el enfoque que solicita en la ventana.

+1

¿Podría publicar algún código de ejemplo? – shieldgenerator7

0

Si crea su GUI con Netbeans, también puede insertar un código de auto por escrito. Solo seleccione un elemento (tal vez el botón, el panel o la ventana) y use la pestaña "Código" en el cuadro de diálogo "Propiedades".

No puede insertar Pre y Post-código por diversas partes del proceso de creación.

Creo que el campo "After-All-Set-Code" de la ventana es un buen lugar para su código, o puede vincularlo al evento ("Propiedades" -dialog-> "Eventos") "componentShown "del campo/panel de texto.

Cuestiones relacionadas