Si desea conservar las capacidades de clasificación de su TableColumn, ninguna de las soluciones anteriores es válida: si convierte su Fecha a una Cadena y lo muestra de esa manera en su TableView; la mesa lo ordenará como tal (tan incorrectamente).
La solución que encontré fue la subclasificación de la clase Date para anular el método toString(). Sin embargo, aquí hay una advertencia: el TableView usa java.sql.Date en lugar de java.util.Date; entonces necesitas subclasificar el primero.
import java.text.SimpleDateFormat;
public class CustomDate extends java.sql.Date {
public CustomDate(long date) {
super(date);
}
@Override
public String toString() {
return new SimpleDateFormat("dd/MM/yyyy").format(this);
}
}
La tabla llamará a ese método para imprimir la fecha.
Por supuesto, es necesario cambiar también la clase Fecha en la declaración TableColumn a la nueva subclase:
@FXML
TableColumn<MyObject, CustomDate> myDateColumn;
Lo mismo cuando se conecta a su atributo de objeto a la columna de la tabla:
myDateColumn.setCellValueFactory(new PropertyValueFactory< MyObject, CustomDate>("myDateAttr"));
Y, por último, para el movimiento de la claridad es así como se declara el captador en su clase de objeto:
public CustomDate getMyDateAttr() {
return new CustomDate(myDateAttr.getTime()); //myDateAttr is a java.util.Date
}
Me tomó un tiempo darme cuenta de esto porque usa java.sql.Date detrás de escena; ¡así que con suerte esto ahorrará a otras personas algo de tiempo!
Esto funciona muy bien para llenar inicialmente la mesa ... si la propiedad fecha en el modelo cambia más tarde de la SimpleStringProperty no emite una notificación, y la tabla no se actualiza. – Adam