Vista de tabla
Este es uno de los controles más potentes ya que nos muestra una tabla formada por filas y columnas y una cabecera para cada una de las columnas. Nos permite visualizar datos complejos y además editarlos. Se podrá definir cómo se edita y se visualiza cada celda. Nos permite seleccionar una fila o varias. También permite ordenar la tabla por columnas.
Una vista de tabla pertenece a la clase javafx.scene.control.TableView
. Cada columna pertenece a la clase javafx.scene.control.TableColumn
.
Necesita tener asociado un modelo de una clase que implemente la interfaz javafx.collections.ObservableList
que indicará las diferentes filas que contendrá. El modelo consistirá en una lista que contendrá elementos pertenecientes a una clase dada y mostraremos atributos en las columnas. Para asociar correctamente el modelo deberemos:
- Crear una lista, con elementos de una clase dada, que implemente
ObservableList
. - Definir cada una de las columnas que queremos mostrar indicando la etiqueta de la cabecera de dicha columna y el tipo que contendrá.
- Añadir las columnas a la vista de tabla.
- Indicar para cada columna cómo podrá obtener los valores del atributo.
Todo esto lo trataremos con más detalle cuando hablemos de la interacción del usuario con las tablas.
En la siguiente imagen se muestra una vista de tabla con dos columnas que muestra una lista de personajes que tiene los atributos nombre y apellidos.
El código utilizado para crear esta interfaz es el siguiente.
package javafx.controles;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class VistaTabla extends Application {
public static class Personaje {
private String nombre;
private String apellidos;
private Personaje(String nombre, String apellidos) {
this.nombre = nombre;
this.apellidos = apellidos;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getApellidos() {
return apellidos;
}
public void setApellidos(String apellidos) {
this.apellidos = apellidos;
}
}
private static final ObservableList<Personaje> PERSONAJES = FXCollections.observableArrayList(
new Personaje("Pepito", "Grillo"),
new Personaje("Bob", "Esponja"),
new Personaje("Juan", "Sin Miedo"),
new Personaje("Perico", "De Los Palotes"),
new Personaje("Juana", "La Loca"));
@Override
public void start(Stage escenarioPrincipal) {
try {
VBox raiz = new VBox();
raiz.setPadding(new Insets(40));
raiz.setSpacing(10);
Label lbPersonajes = new Label("Personajes:");
TableView<Personaje> tvPersonajes = new TableView<>();
TableColumn<Personaje, String> columnaNombre = new TableColumn<>("Nombre");
TableColumn<Personaje, String> columnaApellidos = new TableColumn<>("Apellidos");
tvPersonajes.getColumns().add(columnaNombre);
tvPersonajes.getColumns().add(columnaApellidos);
tvPersonajes.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
columnaNombre.setMinWidth(100);
columnaNombre.setCellValueFactory(new PropertyValueFactory<>("nombre"));
columnaApellidos.setMinWidth(100);
columnaApellidos.setCellValueFactory(new PropertyValueFactory<>("apellidos"));
tvPersonajes.setItems(PERSONAJES);
raiz.getChildren().addAll(lbPersonajes, tvPersonajes);
Scene escena = new Scene(raiz, 300, 250);
escenarioPrincipal.setTitle("Vista de tabla");
escenarioPrincipal.setScene(escena);
escenarioPrincipal.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}