在本例中,我希望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)));
}
});
或者,您可以使用DateTimeFormatter
将LocalDateTime
转换为String
,但是i在这种情况下,表排序将不起作用(将使用字符串排序)。感谢@JFValdes指出这一点。
在这种情况下,您可以使用TableColumn
的setCellValueFactory
方法将其显示为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)));