JavaFX datepicker - 如何更新第二个 datepicker 对象中的日期?
JavaFX datepicker - how to update date in a second datepicker object?
问题:
我在同一场景中有两个日期选择器对象 checkIn_date 和 checkOut_date。
有没有办法自动更改第二个日期选择器对象中的日期字段?
例如:checkIn_date 设置为 2015-08-10,checkOut_date 设置为 2015-08-11。如果我更改 checkIn_date 中的日期字段,即 2015-08-22,checkOut_date 会自动更新为 2015-08-23。
感谢您的任何建议。
您可以通过向 check-in DatePicker
添加侦听器来实现此目的,获取新值,添加您想要的天数并将新值更新到 check-out DatePicker
。
这是一个 MCVE,可以让您更清楚地了解我的意思:
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Main extends Application {
private final int noOfDaysToAdd = 2;
@Override
public void start(Stage primaryStage) throws Exception {
VBox root = new VBox(10);
root.setAlignment(Pos.CENTER);
Label checkInLabel = new Label("Check In : ");
Label checkOutLabel = new Label("Check Out : ");
DatePicker picker1 = new DatePicker();
DatePicker picker2 = new DatePicker();
// Listener for updating the checkout date w.r.t check in date
picker1.valueProperty().addListener((ov, oldValue, newValue) -> {
picker2.setValue(newValue.plusDays(noOfDaysToAdd));
});
HBox checkInBox = new HBox(10, checkInLabel, picker1);
HBox checkOutBox = new HBox(10, checkOutLabel, picker2);
checkInBox.setAlignment(Pos.CENTER);
checkOutBox.setAlignment(Pos.CENTER);
root.getChildren().addAll(checkInBox, checkOutBox);
Scene scene = new Scene(root, 400, 400);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
输出:
更新
您可以重新编写代码段
picker1.valueProperty().addListener((ov, oldValue, newValue) -> {
picker2.setValue(newValue.plusDays(noOfDaysToAdd));
});
没有 lambda 作为 :
picker1.valueProperty().addListener(new ChangeListener<LocalDate>() {
@Override
public void changed(ObservableValue<? extends LocalDate> observable, LocalDate oldValue, LocalDate newValue) {
picker2.setValue(newValue.plusDays(noOfDaysToAdd));
}
});
首先感谢您的帮助!
我从另一个角度解决了我的问题。
加载 scene/view 后,日期选择器将设置为当前签入日期和当前日期的后一天作为签出日期。
对于入住日,我已禁用当前日期之前和退房日期之后的天数选择。
对于退房日,我禁用了退房日期前几天的选择。
很遗憾,我不能post任何图像,因为我的声誉不是 10!
但这是控制器的代码class:
import java.time.LocalDate;
import javafx.fxml.FXML;
import javafx.scene.control.DatePicker;
import com.main.controller.checker.DateChecker;
import com.main.controller.datautil.DataFetch;
import com.main.controller.datautil.DataStore;
import com.main.controller.util.Initilizable;
public class SearchCtrl implements Initilizable{
@FXML
private DatePicker check_in;
@FXML
private DatePicker check_out;
@Override
public void init() {
check_in.setValue(LocalDate.now());
check_out.setValue(check_in.getValue().plusDays(1));
DateChecker.setBeginDateBounds(check_in, check_out.getValue());
DateChecker.setEndDateBounds(check_out, check_in.getValue());
check_in.setOnAction( (event) -> {DateChecker.setEndDateBounds(check_out, check_in.getValue());});
datafine.setOnAction( (event) -> {DateChecker.setBeginDateBounds(check_in, check_out.getValue());});
}
这是 DateChecker class:
import java.time.LocalDate;
import javafx.scene.control.DateCell;
import javafx.scene.control.DatePicker;
import javafx.util.Callback;
public class DateChecker {
private DateChecker(){
}
public static void setBeginDateBounds(DatePicker begin_date, LocalDate end_date ){
final Callback<DatePicker, DateCell> dayCellFactory = new Callback<DatePicker, DateCell>() {
@Override
public DateCell call(final DatePicker datePicker) {
return new DateCell() {
@Override
public void updateItem(LocalDate item, boolean empty) {
super.updateItem(item, empty);
boolean cond = (item.isBefore(LocalDate.now()) || !item.isBefore(end_date));
if (cond){
setDisable(true);
setStyle("-fx-background-color: #d3d3d3;");
}else{
setDisable(false);
setStyle("-fx-background-color: #CCFFFF;");
setStyle("-fx-font-fill: black;");
}
}
};
}
};
begin_date.setDayCellFactory(dayCellFactory);
}
public static void setEndDateBounds(DatePicker end_date, LocalDate begin_date ){
final Callback<DatePicker, DateCell> dayCellFactory = new Callback<DatePicker, DateCell>() {
@Override
public DateCell call(final DatePicker datePicker) {
return new DateCell() {
@Override
public void updateItem(LocalDate item, boolean empty) {
super.updateItem(item, empty);
boolean cond = (item.isBefore(LocalDate.now()) || !item.isAfter(begin_date));
if (cond){
setDisable(true);
setStyle("-fx-background-color: #d3d3d3;");
}else{
setDisable(false);
setStyle("-fx-background-color: #CCFFFF;");
setStyle("-fx-font-fill: black;");
}
}
};
}
};
end_date.setDayCellFactory(dayCellFactory);
}
}
希望对您有所帮助!
问题: 我在同一场景中有两个日期选择器对象 checkIn_date 和 checkOut_date。 有没有办法自动更改第二个日期选择器对象中的日期字段? 例如:checkIn_date 设置为 2015-08-10,checkOut_date 设置为 2015-08-11。如果我更改 checkIn_date 中的日期字段,即 2015-08-22,checkOut_date 会自动更新为 2015-08-23。 感谢您的任何建议。
您可以通过向 check-in DatePicker
添加侦听器来实现此目的,获取新值,添加您想要的天数并将新值更新到 check-out DatePicker
。
这是一个 MCVE,可以让您更清楚地了解我的意思:
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Main extends Application {
private final int noOfDaysToAdd = 2;
@Override
public void start(Stage primaryStage) throws Exception {
VBox root = new VBox(10);
root.setAlignment(Pos.CENTER);
Label checkInLabel = new Label("Check In : ");
Label checkOutLabel = new Label("Check Out : ");
DatePicker picker1 = new DatePicker();
DatePicker picker2 = new DatePicker();
// Listener for updating the checkout date w.r.t check in date
picker1.valueProperty().addListener((ov, oldValue, newValue) -> {
picker2.setValue(newValue.plusDays(noOfDaysToAdd));
});
HBox checkInBox = new HBox(10, checkInLabel, picker1);
HBox checkOutBox = new HBox(10, checkOutLabel, picker2);
checkInBox.setAlignment(Pos.CENTER);
checkOutBox.setAlignment(Pos.CENTER);
root.getChildren().addAll(checkInBox, checkOutBox);
Scene scene = new Scene(root, 400, 400);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
输出:
更新
您可以重新编写代码段
picker1.valueProperty().addListener((ov, oldValue, newValue) -> {
picker2.setValue(newValue.plusDays(noOfDaysToAdd));
});
没有 lambda 作为 :
picker1.valueProperty().addListener(new ChangeListener<LocalDate>() {
@Override
public void changed(ObservableValue<? extends LocalDate> observable, LocalDate oldValue, LocalDate newValue) {
picker2.setValue(newValue.plusDays(noOfDaysToAdd));
}
});
首先感谢您的帮助! 我从另一个角度解决了我的问题。 加载 scene/view 后,日期选择器将设置为当前签入日期和当前日期的后一天作为签出日期。 对于入住日,我已禁用当前日期之前和退房日期之后的天数选择。 对于退房日,我禁用了退房日期前几天的选择。
很遗憾,我不能post任何图像,因为我的声誉不是 10!
但这是控制器的代码class:
import java.time.LocalDate;
import javafx.fxml.FXML;
import javafx.scene.control.DatePicker;
import com.main.controller.checker.DateChecker;
import com.main.controller.datautil.DataFetch;
import com.main.controller.datautil.DataStore;
import com.main.controller.util.Initilizable;
public class SearchCtrl implements Initilizable{
@FXML
private DatePicker check_in;
@FXML
private DatePicker check_out;
@Override
public void init() {
check_in.setValue(LocalDate.now());
check_out.setValue(check_in.getValue().plusDays(1));
DateChecker.setBeginDateBounds(check_in, check_out.getValue());
DateChecker.setEndDateBounds(check_out, check_in.getValue());
check_in.setOnAction( (event) -> {DateChecker.setEndDateBounds(check_out, check_in.getValue());});
datafine.setOnAction( (event) -> {DateChecker.setBeginDateBounds(check_in, check_out.getValue());});
}
这是 DateChecker class:
import java.time.LocalDate;
import javafx.scene.control.DateCell;
import javafx.scene.control.DatePicker;
import javafx.util.Callback;
public class DateChecker {
private DateChecker(){
}
public static void setBeginDateBounds(DatePicker begin_date, LocalDate end_date ){
final Callback<DatePicker, DateCell> dayCellFactory = new Callback<DatePicker, DateCell>() {
@Override
public DateCell call(final DatePicker datePicker) {
return new DateCell() {
@Override
public void updateItem(LocalDate item, boolean empty) {
super.updateItem(item, empty);
boolean cond = (item.isBefore(LocalDate.now()) || !item.isBefore(end_date));
if (cond){
setDisable(true);
setStyle("-fx-background-color: #d3d3d3;");
}else{
setDisable(false);
setStyle("-fx-background-color: #CCFFFF;");
setStyle("-fx-font-fill: black;");
}
}
};
}
};
begin_date.setDayCellFactory(dayCellFactory);
}
public static void setEndDateBounds(DatePicker end_date, LocalDate begin_date ){
final Callback<DatePicker, DateCell> dayCellFactory = new Callback<DatePicker, DateCell>() {
@Override
public DateCell call(final DatePicker datePicker) {
return new DateCell() {
@Override
public void updateItem(LocalDate item, boolean empty) {
super.updateItem(item, empty);
boolean cond = (item.isBefore(LocalDate.now()) || !item.isAfter(begin_date));
if (cond){
setDisable(true);
setStyle("-fx-background-color: #d3d3d3;");
}else{
setDisable(false);
setStyle("-fx-background-color: #CCFFFF;");
setStyle("-fx-font-fill: black;");
}
}
};
}
};
end_date.setDayCellFactory(dayCellFactory);
}
}
希望对您有所帮助!