设置<LocalDateTime>表视图列中的对象属性的格式



在本例中,我希望TableView中的列从LocalDateTime(在源数据模型中)格式化为TableColumn中的"yyyy/MM/dd kk: MM "的格式。(注意:渲染,而不是编辑)好吧,我将需要与本地/ZonedDateTime类型在几个数据模型工作时,在表视图中显示。最好的方法是什么?(我在Oracle Table View教程中没有注意到这类功能的例子)。

Edit-add:或者,也许将数据模型中的值保持为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); }
    }
}

您可以将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,但是i在这种情况下,表排序将不起作用(将使用字符串排序)。感谢@JFValdes指出这一点。

在这种情况下,您可以使用TableColumnsetCellValueFactory方法将其显示为TableView上的String

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)));

相关内容

  • 没有找到相关文章

最新更新