2012-10-05 22 views

Respuesta

37

En el momento de initialize() los controles todavía no están listos para manejar el enfoque.

Puede probar siguiente truco:

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    Platform.runLater(new Runnable() { 
     @Override 
     public void run() { 
      tf.requestFocus(); 
     } 
    }); 
} 

Para aplicaciones complejas difíciles (como Pavel_K tiene en los comentarios) es posible que desee repetir esta rutina varias veces y llamar a la línea método siguiente:

private void repeatFocus(Node node) { 
    Platform.runLater(() -> { 
     if (!node.isFocused()) { 
      node.requestFocus(); 
      repeatFocus(node); 
     } 
    }); 
} 

Tenga en cuenta que se trata de un enfoque no documentado y tal vez sea aconsejable agregar un límite para las repeticiones para evitar ciclos infinitos si algo cambia o se rompe en futuras versiones de Java. Mejor perder el foco que una aplicación completa. :)

+0

esto funciona para mí, ¡Gracias! – Adil

+0

Tuve un problema un tanto relacionado, mi 'TextArea' se negó a obtener el foco mediante programación aunque el escenario estuviera visible y activo ** y ** el hilo en ejecución actual fuera el hilo de la aplicación JavaFX. Pero si seguí el ejemplo y en cola un nuevo 'Runnable' funcionó. Realmente extraño, no tengo palabras para eso. –

+0

Esto ya no parece funcionar con JavaFX 8. 'tf == null' sigue siendo cierto en el momento en que se ejecuta' initialize'. – skiwi

7

Si solicitaFocus(); DESPUÉS de inicializar la escena, ¡funcionará!

De esta manera:

Stage stage = new Stage(); 
GridPane grid = new GridPane(); 
//... add buttons&stuff to pane 

Scene scene = new Scene(grid, 800, 600); 

TEXTFIELD.requestFocus(); 

stage.setScene(scene); 
stage.show(); 

espero que esto ayude. :)

5

La misma respuesta que @Sergey Grinev. Asegúrese de que su versión de Java esté actualizada (JDK 1.8 o posterior).

Platform.runLater(()->myTextField.requestFocus()); 
Cuestiones relacionadas