我有以下问题。
我正在为学校分配作业,我们需要在表格视图中显示gregoriancalendar值。
这是我的桌子代码
TableColumn geboortedatum = new TableColumn("Geboortedatum");
geboortedatum.setCellValueFactory(new PropertyValueFactory<Persoon, SimpleDateFormat>("gebDat"));
当我实际运行它时,无论如何我都会在表视图中获得以下值。
java.util.GregorianCalendar[time=-23574157200000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Berlin",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=143,lastRule=java.util.SimpleTimeZone[id=Europe/Berlin,offset=3600000,dstSavings=3600000,useDaylight=true,startyear=0,startMode=2,startMonth=2,startDay=-1,startTime=360000
这样下去
有谁对我有一个简单的解决方案?我可能在这里错过了一些非常简单的事情。
最佳答案
首先,看起来您PropertyValueFactory
的类型错误。之所以能够避免这种情况,是因为您使用的是原始TableColumn
,但是如果您正确键入该列,则代码将更易于理解。从输出中,我可以看到您的Persoon.getGebDat()
方法返回了Calendar
对象。所以你应该有
TableColumn<Persoon, Calendar> geboortedatum = new TableColumn<>("Geboortedatum");
geboortedatum.setCellValueFactory(new PropertyValueFactory<Persoon, Calendar>("gebDat"));
TableCell
的默认行为是调用其显示的项目的toString
方法。您看到的文本是在toString
对象上调用Calendar
的结果。要更改数据的显示方式,您需要在
TableColumn
上指定一个单元格工厂,该工厂将创建一个TableCell
,该工厂知道如何根据需要设置Calendar
的格式。所以你会做类似的事情
final DateFormat dateFormat = DateFormat.getDateInstance() ; // or whatever format object you need...
geboortedatum.setCellFactory(col -> new TableCell<Persoon, Calendar>() {
@Override
public void updateItem(Calendar item, boolean empty) {
super.updateItem(item, empty);
if (item == null) {
setText(null);
} else {
setText(dateFormat.format(item.getTime()));
}
}
});