如何更改项目中所有 DatePickers 的 属性? (javaFX)

How do I change a property of all DatePickers in my project? (javaFX)

我的项目中有多个 DatePickers,我想让它让用户无法编辑文本字段,因此他们不能 select 所有这些日期都在今天之前的日期。
我知道如何对单个 DatePickers 执行此操作,但 我想要一种方法将其应用于所有 DatePickers
这是我将单独用于它们的代码:

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

编辑: 正如 James_D 评论的那样,我可以将这些命令放在我使用的解决方案的方法中。为此使用构建器也很有趣,感谢您的详细回答。

使用某种创作模式,例如构建器模式。

创建 Builder<DatePicker> 的实现:

import java.time.LocalDate;

import javafx.scene.control.DateCell;
import javafx.scene.control.DatePicker;
import javafx.util.Builder;

public class DatePickerBuilder implements Builder<DatePicker>{

    public DatePicker build() {
        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 );
            }
        });
        return datePicker ; 

    }
}

如果您在 Java 代码中创建 DatePicker,您可以简单地实例化一个 DatePickerBuilder 并使用它:

private final DatePickerBuilder datePickerBuilder = new DatePickerBuilder();

// ...

// any time you need a `DatePicker` do
DatePicker datePicker = datePickerBuilder.build();

如果您使用的是 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) ;
    }
    
    
}

然后您可以将其提供给您的 FXMLLoader:

    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("path/to/fxml"));
    fxmlLoader.setBuilderFactory(new DatePickerBuilderFactory());
    Parent root = fxmlLoader.load();

弃用说明:

JavaFX 2.0 版中定义的个别 Builder 类 由于实施错误在 8.0 版中已弃用,并在 9 版中删除,因为没有干净的方法来修复该错误。

但是,BuilderFactoryBuilder接口仍然被FXMLLoader支持和使用,所以这个代码仍然被支持。