在TableView列中格式化ObjectProperty <localdatetime>

时间:2016-06-27 03:38:14

标签: java datetime javafx tableview

在此示例中,我希望我的TableView中的列可以从LocalDateTime(在源数据模型中)格式化为“yyyy / MM / dd kk:mm”格式“在TableColumn中。 (注意:对于渲染,而不是编辑)好吧,在表视图中显示时,我需要在一些数据模型中使用Local / ZonedDateTime类型。做这个的最好方式是什么? (我没有注意到Oracle Table View教程中此类功能的示例)。

编辑 - 添加:或者,可能将数据模型中的值保持为String(格式化),并且在处理记录时使用转换为LocalDateTime最好?

import java.time.LocalDateTime;

import javafx.application.Application;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.stage.Stage;

public class Main extends Application {
    @Override
    public void start(Stage stage) {

        final ObservableList<Foo> data = FXCollections.observableArrayList();
        LocalDateTime ldt = LocalDateTime.now();
        data.add(new Foo(ldt));
        data.add(new Foo(ldt.plusDays(1)));
        data.add(new Foo(ldt.plusDays(2)));

        TableView<Foo> table = new TableView<Foo>();
        table.setItems(data);

        TableColumn<Foo, LocalDateTime> ldtCol = new TableColumn<Foo, LocalDateTime>("LDT");
        // --- Set cell factory value ---

        table.getColumns().addAll(ldtCol);
        Scene scene = new Scene(table);
        stage.setScene(scene);
        stage.show();
    } 

    public static void main(String[] args) {
        launch(args);
    }

    class Foo {
        private final ObjectProperty<LocalDateTime> ldt = 
                new SimpleObjectProperty<LocalDateTime>();

        Foo(LocalDateTime ldt) {
            this.ldt.set(ldt);
        }

        public ObjectProperty<LocalDateTime> ldtProperty() { return ldt; }
        public LocalDateTime getLdt() { return ldt.get(); }
        public void setLdt(LocalDateTime value) { ldt.set(value); }

    }
}

1 个答案:

答案 0 :(得分:8)

您可以TableColumn作为TableColumn<Foo, LocalDateTime>:使用LocalDateTime属性作为值,您可以为列定义cellFactory以显示它:

TableColumn<Foo, LocalDateTime> ldtCol = new TableColumn<Foo, LocalDateTime>("LDT");
ldtCol.setCellValueFactory(cellData -> cellData.getValue().ldtProperty());
ldtCol.setCellFactory(col -> new TableCell<Foo, LocalDateTime>() {
    @Override
    protected void updateItem(LocalDateTime item, boolean empty) {

        super.updateItem(item, empty);
        if (empty)
            setText(null);
        else
            setText(String.format(item.format(formatter)));
    }
});

或者,您可以DateTimeFormatterLocalDateTime转换为String,但我 n这种情况下表格排序不起作用(将使用字符串排序)。感谢@JFValdes指出这一点。

在这种情况下,您可以使用TableColumn的{​​{3}}方法在String上将其显示为TableView

private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd hh:mm");

...    

TableColumn<Foo, String> ldtCol = new TableColumn<Foo, String>("LDT");
ldtCol.setCellValueFactory(foo -> new SimpleStringProperty(foo.getValue().getLdt().format(formatter)));