Jeśli chcesz zachować możliwości sortowania w TableColumn, żadne z powyższych rozwiązań nie jest poprawne: jeśli konwertujesz swoją datę na ciąg i pokazuje to w ten sposób w swoim TableView; tabela posortuje ją jako taką (tak niepoprawnie).
Rozwiązanie, które znalazłem, podklasy klasy Date w celu nadpisania metody toString(). Istnieje jednak zastrzeżenie: TableView używa java.sql.Date zamiast java.util.Date; więc musisz podklasować ten pierwszy.
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);
}
}
Tabela wywoła tę metodę w celu wydrukowania daty.
Oczywiście, trzeba zmienić też datę klasę w deklaracji TableColumn do nowej podklasy:
@FXML
TableColumn<MyObject, CustomDate> myDateColumn;
samo po podłączeniu swój atrybut obiektu do kolumny tabeli:
myDateColumn.setCellValueFactory(new PropertyValueFactory< MyObject, CustomDate>("myDateAttr"));
I wreszcie, dla poruszenia jasności ten sposób można zadeklarować getter w swojej klasie obiektu:
public CustomDate getMyDateAttr() {
return new CustomDate(myDateAttr.getTime()); //myDateAttr is a java.util.Date
}
Zajęło mi trochę czasu, aby dowiedzieć się, ze względu na to, że używa java.sql.Date za kulisami; więc mam nadzieję, że to zaoszczędzi innym ludziom trochę czasu!
Działa to dobrze dla początkowego zapełniania tabeli ... jeśli właściwość daty w modelu zmienia się później niż SimpleStringProperty nie wysyła powiadomienia, a tabela nie jest aktualizowana. – Adam