es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

JavaFX tableview desplazamiento automático al elemento seleccionado al presionar un botón para selectNext() o selectPrevious()

Estoy escribiendo un programa de JavaFX con una TableView llamada ‘table’ y 2 botones llamados ‘previous’ y ‘next’.

Aquí está parte del código:

Anteriormente:

previous.setOnAction(event -> {
     table.getSelectionModel().selectPrevious();
});

next.setOnAction(event -> {
     table.getSelectionModel().selectNext();
});

Sin embargo, si sigo presionando los botones, la tabla no se desplazará automáticamente para mantener visible el elemento seleccionado. Así que modifiqué el código de la siguiente manera:

Modificado:

previous.setOnAction(event -> {
     table.getSelectionModel().selectPrevious();
     table.scrollTo(table.getSelectionModel().getSelectedItem());
});

next.setOnAction(event -> {
     table.getSelectionModel().selectNext();
     table.scrollTo(table.getSelectionModel().getSelectedItem());
});

Pero siempre intentará mantener el elemento seleccionado en la parte superior de la región visible. Si continúo presionando ‘next’, el elemento seleccionado se mantendrá en la parte superior en lugar de permanecer en la parte inferior.

Quiero imitar el comportamiento natural de una TableView de manera que, si presiono arriba o abajo en el teclado con algo seleccionado, la TableView se desplazará automáticamente para mantener visible el elemento seleccionado.

¿Cómo debería modificar el código para hacer que el desplazamiento automático sea más natural cuando presiono los botones?

Gracias

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para hacer que el desplazamiento automático sea más natural al presionar los botones, puedes modificar el código para verificar la posición del elemento seleccionado en la tabla y luego ajustar el desplazamiento basado en esa posición. Aquí tienes un ejemplo de código:

    previous.setOnAction(event -> {
        int index = table.getSelectionModel().getSelectedIndex() - 1;
        if (index >= 0) {
            table.getSelectionModel().select(index);
            table.scrollTo(index);
        }
    });
    
    next.setOnAction(event -> {
        int index = table.getSelectionModel().getSelectedIndex() + 1;
        if (index < table.getItems().size()) {
            table.getSelectionModel().select(index);
            int lastIndex = index - 1;
            if (lastIndex >= 0) {
                double h = (lastIndex + 1.0) * table.getFixedCellSize();
                double viewportH = table.getHeight();
                double headerH = table.lookup(".column-header-background").getBoundsInLocal().getHeight();
                double spacing = table.lookup(".table-row-cell").snappedBottomInset();
                double max = h - viewportH + headerH + spacing;
                if (table.getVvalue() < max) {
                    table.setVvalue(max);
                }
            }
        }
    });
    

    El botón previous seleccionará el elemento anterior y se desplazará hasta él si existe. El botón next seleccionará el siguiente elemento y se desplazará hasta él si existe, y también ajustará la posición de desplazamiento vertical si es necesario para mantener el elemento seleccionado visible. El cálculo para la posición de desplazamiento vertical tiene en cuenta el tamaño de celda fijo, el alto de la tabla, la altura del encabezado, el espaciado entre filas y la ubicación del último elemento visible.

    Ten en cuenta que este código asume un tamaño de celda fijo para las filas. Si tu tableview tiene alturas de fila variables, es posible que debas ajustar el cálculo de desplazamiento en consecuencia.

Comments are closed.