如何更改项目中所有日期选择器的属性?(javaFX)

如何更改项目中所有日期选择器的属性?(javaFX),javafx,datepicker,javafx-datepicker,Javafx,Datepicker,Javafx Datepicker,我的项目中有多个日期选择器,我希望这样做,以便用户无法编辑文本字段,也无法在所有日期上选择今天日期之前的日期。 我知道如何对每个日期选取者执行此操作,但我希望有一种方法将此应用于所有人 下面是我将分别为他们使用的代码: DatePicker datePicker = new DatePicker(); datePicker.getEditor().setDisable(true); datePicker.getEditor().setOpacity(1); datePicker.setDayCe

我的项目中有多个日期选择器,我希望这样做,以便用户无法编辑文本字段,也无法在所有日期上选择今天日期之前的日期。
我知道如何对每个日期选取者执行此操作,但我希望有一种方法将此应用于所有人
下面是我将分别为他们使用的代码:

DatePicker datePicker = new DatePicker();
datePicker.getEditor().setDisable(true);
datePicker.getEditor().setOpacity(1);
datePicker.setDayCellFactory(param -> new DateCell() {
                @Override
                public void updateItem(LocalDate date, boolean empty) {
                    super.updateItem(date, empty);
                    setDisable(empty || date.compareTo(LocalDate.now()) < 0 );
                }
            });
DatePicker-DatePicker=new-DatePicker();
datePicker.getEditor().setDisable(true);
datePicker.getEditor().setOpacity(1);
datePicker.setDayCellFactory(参数->新建日期单元格(){
@凌驾
public void updateItem(LocalDate,布尔值为空){
super.updateItem(日期,空);
setDisable(空| | date.compareTo(LocalDate.now())<0);
}
});
编辑:
正如James_D所评论的,我可以将这些命令放在一个方法中,这就是我使用的解决方案。使用构建器也很有趣,谢谢你的详细回答。

使用某种创造性模式,例如构建器模式

创建
Builder
的实现:

    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("path/to/fxml"));
    fxmlLoader.setBuilderFactory(new DatePickerBuilderFactory());
    Parent root = fxmlLoader.load();
如果您使用的是FXML,则可以将
DatePickerBuilder
包装到自定义
BuilderFactory

import javafx.fxml.JavaFXBuilderFactory;
import javafx.scene.control.DatePicker;
import javafx.util.Builder;
import javafx.util.BuilderFactory;

public class DatePickerBuilderFactory implements BuilderFactory {

    private final BuilderFactory defaultFactory ;
    private final DatePickerBuilder builder ;
    
    public DatePickerBuilderFactory() {
        defaultFactory = new JavaFXBuilderFactory();
        builder = new DatePickerBuilder();
    }

    @Override
    public Builder<?> getBuilder(Class<?> type) {
        if (type == DatePicker.class) {
            return builder;
        } else return defaultFactory.getBuilder(type) ;
    }
    
    
}
弃用说明:

JavaFX版本2.0中定义的单个
Builder
类在版本8.0中由于实现错误而被弃用,并在版本9中删除,因为没有明确的方法修复该错误


但是,
fxmloader
仍然支持并使用
BuilderFactory
Builder
接口,因此仍然支持此代码。

您是如何创建它们的?如果您是用Java(而不是FXML)创建它们,只需创建一个方法,创建一个新的
日期选择器
,将其配置为您发布的代码,然后返回它。如果是FXML,则创建一个方法,例如
private void configureDatePickers(DatePicker…pickers){…}
,并将它们全部传递给它。这不是太复杂了吗?为什么不简单地扩展
DatePicker
并在任何地方都使用这个子类?@julien.gib而且仅仅使用继承来配置对象通常是一个糟糕的想法。继承应用于提供附加功能。请参阅“有效的Java”,或者直截了当地说,任何超越基础的OO教科书。这种方法更灵活,更易于维护,尤其是在使用FXML的情况下,因为所有配置(或至少可以)完全独立于布局代码。只需稍微修改构建器工厂(以支持用户提供的基础构建器工厂,而不只是假设默认值),您就可以轻松地用其他构建器因素修饰多个构建器因素,并在FXML中独立自定义不同元素的创建,而无需触摸FXML文件。我明白了。谢谢你的信息
import javafx.fxml.JavaFXBuilderFactory;
import javafx.scene.control.DatePicker;
import javafx.util.Builder;
import javafx.util.BuilderFactory;

public class DatePickerBuilderFactory implements BuilderFactory {

    private final BuilderFactory defaultFactory ;
    private final DatePickerBuilder builder ;
    
    public DatePickerBuilderFactory() {
        defaultFactory = new JavaFXBuilderFactory();
        builder = new DatePickerBuilder();
    }

    @Override
    public Builder<?> getBuilder(Class<?> type) {
        if (type == DatePicker.class) {
            return builder;
        } else return defaultFactory.getBuilder(type) ;
    }
    
    
}
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("path/to/fxml"));
    fxmlLoader.setBuilderFactory(new DatePickerBuilderFactory());
    Parent root = fxmlLoader.load();