如何更改项目中所有 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 版中删除,因为没有干净的方法来修复该错误。
但是,BuilderFactory
和Builder
接口仍然被FXMLLoader
支持和使用,所以这个代码仍然被支持。
我的项目中有多个 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 版中删除,因为没有干净的方法来修复该错误。
但是,BuilderFactory
和Builder
接口仍然被FXMLLoader
支持和使用,所以这个代码仍然被支持。