He estado aprendiendo un poco sobre JavaFX 2 pero he encontrado un problema con las celdas de la tabla editable que tampoco puedo encontrar una solución. Para evitar pegar mucho código, he creado un proyecto que contiene solo el ejemplo de TableView de la documentación de JavaFX: http://docs.oracle.com/javafx/2/ui_controls/table-view.htm

Si ejecuta este código, verá este comportamiento:

  1. Al hacer clic en una fila, se selecciona esa fila.
  2. Al hacer clic en una celda de la fila seleccionada, la celda se convierte en un campo de texto para que esté lista para ser editada.
  3. Hacer clic en el campo de texto permite editar el contenido.

El problema es que son tres clics para llegar al punto en el que 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 suposición con respecto a cómo lograr esto fue agregar 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 se enfoca pero luego lo pierde nuevamente. Pegar un punto de interrupción en el oyente parece indicar que TableView está recuperando el foco antes de que se muestre el campo de texto.

Por lo tanto, la pregunta es ¿cómo le doy el foco al campo de texto cuando comienza la edición?

6
wobblycogs 26 abr. 2012 a las 14:19

1 respuesta

La mejor respuesta

¿Podría reemplazar la línea textField.requestFocus(); por:

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

E intenta de nuevo.

8
Uluk Biy 26 abr. 2012 a las 14:27
1
Gracias Uluk, eso lo solucionó. Al mirar la documentación de runLater, supongo que esto podría fallar, ya que no ofrece ninguna garantía sobre cuándo se ejecutará; presumiblemente, podría ejecutarse antes de que la tabla recupere el enfoque.
 – 
wobblycogs
26 abr. 2012 a las 15:02
Estoy de acuerdo con wobblycogs, he usado el truco runlater para solicitar enfoque varias veces en el pasado y siempre me ha funcionado, pero la falta de certeza de que continuará funcionando no me da una sensación cálida y difusa. sobre eso. (Una alternativa es usar una línea de tiempo para retrasar la solicitud de enfoque incluso más tarde, pero ese enfoque tiene sus propios problemas).
 – 
jewelsea
26 abr. 2012 a las 22:10