如何在 FXML 中为 javafx DatePicker 设置默认值?
Posted
技术标签:
【中文标题】如何在 FXML 中为 javafx DatePicker 设置默认值?【英文标题】:How to set default value for javafx DatePicker in FXML? 【发布时间】:2015-11-01 04:40:37 【问题描述】:是否可以在 FXML 级别初始化 DatePicker 的默认值?
<children>
<DatePicker fx:id="datePicker" value="2015-07-20"/>
<Label fx:id="messageLabel" textAlignment="JUSTIFY" />
</children>
显然是抛出了异常,是不是调用了LocalDate的构造函数?
例如:
<DatePicker fx:id="datePicker" value="LocalDate.of(2015,07,20)"/>
【问题讨论】:
我意识到我可以将它放入控制器的初始化中,但我想知道是否可以在 FXML 级别填充它 【参考方案1】:为了能够从 FXML 文件实例化 java.time.LocalDate,您需要为该类创建并注册一个自定义构建器。
为 LocalDate 创建一个构建器。构建器必须实现 javafx.util.Builder 及其构建方法。下面是一个采用三个参数(年、月、日)的构建器示例:
package util;
import java.time.LocalDate;
import javafx.util.Builder;
public class LocalDateBuilder implements Builder<LocalDate>
private int year;
private int month;
private int dayOfMonth;
@Override
public LocalDate build()
return LocalDate.of(year, month, dayOfMonth);
public int getYear()
return year;
public void setYear(int year)
this.year = year;
public int getMonth()
return month;
public void setMonth(int month)
this.month = month;
public int getDayOfMonth()
return dayOfMonth;
public void setDayOfMonth(int dayOfMonth)
this.dayOfMonth = dayOfMonth;
创建一个装饰默认 FactoryBuilder 的 FactoryBuilder 包装器,以便在需要 LocalDate 构建器时返回您的构建器。这是一个示例 FactoryBuilderWrapper 类。
package util;
import java.time.LocalDate;
import javafx.util.Builder;
import javafx.util.BuilderFactory;
public class BuilderFactoryWrapper implements BuilderFactory
private BuilderFactory builderFactory;
public BuilderFactoryWrapper(BuilderFactory builderFactory)
this.builderFactory = builderFactory;
@Override
public Builder<?> getBuilder(Class<?> klass)
if (klass == LocalDate.class)
// return our builder
return new LocalDateBuilder();
else
// return the default builder
return builderFactory.getBuilder(klass);
在您的应用程序的启动方法中,获取默认的 FactoryBuilder,用您的包装器包装它并重新分配给 FXMLLoader:
@Override
public void start(Stage stage) throws Exception
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("myUI.fxml"));
BuilderFactory builderFactory = loader.getBuilderFactory();
// wrap the default BuilderFactory
loader.setBuilderFactory(new
BuilderFactoryWrapper(builderFactory));
Parent root = loader.load();
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
以下是用于创建具有 LocalDate 类型的birthDate 属性的 Person 的 FXML 代码:(您需要导入 java.time.LocalDate,而不是构建器本身)
<?import model.Person?>
<?import java.time.LocalDate?>
...
<Person firstName="Jane" lastName="Citizen">
<birthDate>
<LocalDate year="1980" month="12" dayOfMonth="19"/>
</birthDate>
</Person>
【讨论】:
嘿,谢谢你用尽全力的回答!有点晚了,但还是有价值的! +1 你的控制器在哪里?你在哪里定义我确定您无法在 FXML 级别填充 DatePicker,因为您无法在 FXML 级别实例化 LocalDate 对象,因为
LocalDate
没有默认构造函数
LocalDate
没有静态 valueOf(String)
方法
javafx.fxml.JavaFXBuilderFactory#getBuilder(LocalDate.class)
返回 null
,表示 LocalDate 没有构建器
【讨论】:
很好的答案,谢谢。我最终设置在控制器中。【参考方案3】:您可以通过控制器将日期的默认值设置为今天。以下线路对我有用。
datePicker.setValue(LocalDate.now());
【讨论】:
【参考方案4】:此方法返回当前日期:-
// Date Now ### "To Date Picker"
public static final LocalDate NOW_LOCAL_DATE ()
String date = new SimpleDateFormat("dd-MM- yyyy").format(Calendar.getInstance().getTime());
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
LocalDate localDate = LocalDate.parse(date , formatter);
return localDate;
然后在initialize方法中调用它:
datePicker.setValue(NOW_LOCAL_DATE());
【讨论】:
【参考方案5】:如果你正在实现 Initializable,你可以在你的控制器中做这样的事情:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy", this.locale);
birthDate.setValue(LocalDate.parse(formatter.format(LocalDate.now())));
【讨论】:
以上是关于如何在 FXML 中为 javafx DatePicker 设置默认值?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 FXML 在 JavaFX 中创建 CheckBoxTreeItem
如何使用不同的 fxml 文件创建多个 javafx 控制器?