2015-08-08 53 views
3

是否可以在FXML级别初始化DatePicker的默认值?如何在FXML中为javafx 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)"/> 
+0

我意识到我可以把它放在控制器的初始化中,但我想知道是否可以在FXML级别填充它 – Palcente

回答

2

我敢肯定,你不能在FXML水平填充的DatePicker,因为你不能实例化FXML水平的对象LOCALDATE因为

  1. LocalDate没有默认构造函数
  2. LocalDate没有静态valueOf(String)方法
  3. javafx.fxml.JavaFXBuilderFactory#getBuilder(LocalDate.class)返回null,这意味着没有建设者LOCALDATE的
+0

伟大的答案谢谢。我结束了在控制器中的设置。 – Palcente

3

为了能够从FXML文件实例java.time.LocalDate,你需要创建并注册类的自定义生成器。

  1. 为LocalDate创建一个构建器。构建器必须实现javafx.util.Builder及其构建方法。这里是一个生成器,有三个参数(年,月,请将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. 创建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); 
         } 
        } 
    } 
    
  3. 在应用程序的启动方法,获取默认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(); 
    } 
    

以下是FXML代码来创建一个Person与类型LocalDate的birthDate属性:(您需要导入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> 
+0

嘿,谢谢你用尽了答案!有点晚但仍然有价值! +1 – Palcente

+1

你的控制器在哪里?你在哪里定义了? – 7twenty7

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; 
    } 

然后调用它里面初始化方法:

datePicker.setValue(NOW_LOCAL_DATE()); 
1

在你的控制器,你可以做这样的事情,如果你正在执行Initializable:

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