如何在FXML中为JavaFX DatePicker设置默认值?

3

在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级别上填充它。 - Palcente
5个回答

5
您可以通过控制器将日期的默认值设置为今天。以下代码对我有效:

您可以通过控制器将日期的默认值设置为今天。以下代码对我有效:

datePicker.setValue(LocalDate.now());

4
为了能够从FXML文件中实例化java.time.LocalDate,您需要创建并注册该类的自定义构建器。
  1. Create a builder for LocalDate. A builder must implement javafx.util.Builder and its build method. Here is an example of a builder that takes three parameters (year, month, dayOfMonth):

    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;
        }
    }
    
  2. Create a FactoryBuilder wrapper that decorates the default FactoryBuilder so that it will return your builder when a LocalDate builder is needed. Here is a sample FactoryBuilderWrapper class.

    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);
            }
        }
    }
    
  3. In your application's start method, obtain the default FactoryBuilder, wrap it with your wrapper and reassign it to the 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 - Palcente
1
你的控制器在哪里?你在哪里定义了<birthDate>? - 7twenty7

3

我确定你无法在FXML级别上填充DatePicker,因为你不能在FXML级别上实例化LocalDate对象,原因如下:

  1. LocalDate没有默认构造函数
  2. LocalDate没有静态的valueOf(String)方法
  3. javafx.fxml.JavaFXBuilderFactory#getBuilder(LocalDate.class)返回null,表示没有针对LocalDate的生成器

非常好的答案,谢谢。我最终在控制器中进行了设置。 - Palcente

2

这个方法返回当前日期:

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

1

如果您正在实现Initializable,则可以在控制器中执行以下操作:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy", this.locale);
birthDate.setValue(LocalDate.parse(formatter.format(LocalDate.now())));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接