2012-04-26 47 views
6

He estado aprendiendo un poco sobre JavaFX 2 pero he encontrado un problema con las celdas de tablas editables que tampoco puedo encontrar una solución. Para guardar pegar en una gran cantidad de código que he creado un proyecto que contiene sólo el ejemplo TableView de la documentación de JavaFX: http://docs.oracle.com/javafx/2/ui_controls/table-view.htmJava FX 2 Edición y enfoque de celdas de tabla

Si ejecuta este código que ve este comportamiento:

  1. Al hacer clic en una fila selecciona esa fila.
  2. Al hacer clic en una celda en la fila seleccionada, la celda se convierte en un campo de texto para que esté listo para ser editado.
  3. Al hacer clic en el campo de texto, se pueden editar los contenidos.

El problema es que hay tres clics para llegar al punto donde se puede editar la celda. Lo que me gustaría lograr es cuando el campo de texto en el foco creado (por ejemplo, paso 2) cambie al campo de texto directamente.

Mi mejor conjetura sobre la forma de alcanzar este objetivo era añadir textField.requestFocus() al final del método startEditing():

@Override 
public void startEdit() { 
    super.startEdit(); 

    if (textField == null) { 
     createTextField(); 
    } 
    setGraphic(textField); 
    setContentDisplay(ContentDisplay.GRAPHIC_ONLY); 
    textField.selectAll(); 
    textField.requestFocus(); 
} 

pero esto no funciona. Si agrego un oyente de enfoque al campo de texto, lo que encuentro es que obtiene el foco pero luego lo pierde de nuevo. Poner un punto de quiebre en el oyente parece indicar que TableView está volviendo a enfocar antes de que se muestre el campo de texto.

Por lo tanto, la pregunta es ¿cómo doy enfoque al campo de texto cuando se inicia la edición?

Respuesta

8

Podría por favor reemplace la línea textField.requestFocus(); con:

 Platform.runLater(new Runnable() { 
      @Override 
      public void run() { 
       textField.requestFocus(); 
      } 
     }); 

y vuelve a intentarlo.

+1

Gracias Uluk, eso lo solucionó. En cuanto a la documentación de runLater, supongo que esto podría fallar, ya que no ofrece ninguna garantía sobre cuándo se ejecutará, es de suponer que podría ejecutarse antes de que la mesa recupere el foco. – wobblycogs

+0

Estoy de acuerdo con los wobblycogs, he usado el truco del runlater para solicitar atención varias veces en el pasado y siempre me ha funcionado, pero la falta de certeza de que continúe funcionando no me da un aire cálido y borroso Sintiéndolo al respecto. (Una alternativa es usar una línea de tiempo para enviar la solicitud de enfoque incluso más tarde, pero ese enfoque tiene sus propios problemas). – jewelsea

Cuestiones relacionadas