如何在 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 你的控制器在哪里?你在哪里定义 【参考方案2】:

我确定您无法在 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 控制器?

JavaFX:如何从 MenuItem 更改场景 (FXML)

通过代码关闭 fxml 窗口,javafx

如何引用资源文件夹中的 javafx fxml 文件?

在 JavaFX FXML 控制器中实现构造函数