Utilizando TableView
Autor: Jean Paul Lopes | Publicado: 2011-07-06T06:05:00-07:00

Uno de los principales componentes visuales incorporados en JavaFX 2.0 (1.3 estaba en la vista previa) fue el TableView.

Que ofrece un gran apoyo en la presentación de los datos en formato de tabla, a partir de un estándar de rendimiento para una personalización completa de cada celda.

Al principio hay que tener en cuenta que una tabla está formada por filas y columnas, y cada intersección que forman una celda.

Por definición, un JavaFX TableView tiene la fuente de datos para su formación un ObservableList de objecto con una estructura específica, que yo llamo la frecuencia JavaFxBean. A JavaFxBean tiene una estrecha estructura de JavaBeans, pero sus atributos son descendientes (extensiones) de la interfaz javafx.beans.Property (StringProperty, IntegerProperty, BooleanProperty, OBJECTPROPERTY). De acuerdo con la documentación de la API 2.0 que tiene este formato:
public class Person {
private StringProperty firstName;
public void setFirstName(String value) { firstName.set(value); }
public String getFirstName() { return firstName.get(); }
public StringProperty firstNameProperty() { 
if (firstName == null) firstName = new StringProperty();
return firstName; 
}

private StringProperty lastName;
public void setLastName(String value) { lastName.set(value); }
public String getLastName() { return lastName.get(); }
public StringProperty lastNameProperty() { 
if (lastName == null) lastName = new StringProperty();
return lastName; 
} 
}
En mi ejemplo utilizo una clase JPA TbTlmkChamada que es recuperada por la clase TbTlmkChamadaJpaController. A medida que lo JPA sólo permite la utilización de determinados tipos de atributos (en el que los descendientes de los Property´s no se ajustan a) He creado una clase (Proxy) TbTlmkChamadaFxBean con el fin de recibir los objetos de base de datos. Esta clase sólo tiene los mismos atributos que la clase original, pero con los descendientes de los tipos de javafx.beans.Property.

Bueno, no han tocado el TableView. El momento es ahora.

Para una vista básica, podemos crear un estándar TableView con el siguiente formato:
TbTlmkChamadaJpaController control = new TbTlmkChamadaJpaControllerImpl(telemarketingserver.TelemarketingServer.emf); 

tabela = new TableView();
List&lt;TbTlmkChamada&gt; findTbTlmkChamadaEntities = control.findTbTlmkChamadaEntities();

List&lt;TbTlmkChamadaFxBean&gt; lista = new ArrayList&lt;TbTlmkChamadaFxBean&gt;();
for (int i=0;i &lt; TbTlmkChamadaEntities.size();i++) {
lista.add(new TbTlmkChamadaFxBean(findTbTlmkChamadaEntities.get(i)));
}
ObservableList&lt;TbTlmkChamadaFxBean&gt; chamadas = FXCollections.observableList(lista);
tabela.setItems(chamadas);
TableColumn&lt;Integer&gt; codigoCol = new TableColumn&lt;Integer&gt;("Código");
codigoCol.setProperty("codigo");
TableColumn&lt;String&gt; dadosCol = new TableColumn&lt;String&gt;("Dados");
dadosCol.setProperty("dados");
TableColumn&lt;Date&gt; dataCol = new TableColumn&lt;Date&gt;("Data");
dataCol.setProperty("proxChamada");

final TableColumn&lt;TbTlmkFila&gt; filaCol = new TableColumn&lt;TbTlmkFila&gt;("Fila");
filaCol.setProperty("fila");


tabela.getColumns().addAll(codigoCol,dadosCol,filaCol,dataCol);
tabela.setPrefWidth(800);
getChildren().add(tabela);
que se traducirá en una tabla como ésta:

Como usted puede ver las columnas se colocó en segundo lugar la clase atributos TbTlmkChamadaFxBean (utilizando su método toString ()).

Ahora usted puede mejorar el funcionamiento de esta tabla. Inicialmente, el orden de las filas (en el código de ejemplo para la columna):
codigoCol.setComparator(new Comparator() {

@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
});
Con estas líneas de código que establece la comparación utilizada por el columna codigoCol para comparar el valor de los objetos.

También puede modificar el contenido visible de cada célula, como en el siguiente código:
filaCol.setCellFactory(new Callback&lt;TableColumn&lt;TbTlmkFila&gt;, TableCell&lt;TbTlmkFila&gt;&gt;() {

@Override
public TableCell&lt;TbTlmkFila&gt; call(TableColumn&lt;TbTlmkFila&gt; param) {
TableCell&lt;TbTlmkFila&gt; cell = new TableCell&lt;TbTlmkFila&gt;() {
@Override public void updateItem(TbTlmkFila value, boolean empty) {
super.updateItem(value, empty);

if (empty) {
setNode(null);
} else {
VBox vbox = new VBox(5);
vbox.getChildren().add(new Label(value.getNome()));
vbox.getChildren().add(new Label(value.getCliente().getNome()));
vbox.setStyle("-fx-background-color:#FF0000;");
setNode(vbox);
}
}
};
return cell;



}
});
Utilizando el método setCellFactory és possible crear CellFactory´s personalizado para cada columna. Lo que no está bien documentada en la API de JavaFX 2.0 es la forma de acceder al valor del objeto en relación con la célula. Esto se hace escribiendo en la UpdateItem método. Dentro de este método es donde se establece lo que se presentará en cada celda.

El resultado de este código es el siguiente tabla:

como resultado de CellFactory una columna es un objeto de nodo de clase, la imaginación de los desarrolladores es el límite de lo que se puede presentar en una celda: Región, ListView, Button, de otros TableView. Las posibilidades son infinitas.

Espero que este mensaje puede ser útil a alguien como lo fue para mí.

Buenos códigos a todos.