问题: 我在同一个场景中有两个datepicker对象checkIn_date和checkOut_date。 有一种方法可以自动更改第二个datepicker对象中的日期字段吗? 例如:checkIn_date设置为2015-08-10,checkOut_date设置为2015-08-11。如果我在checkIn_date中更改日期字段,即2015-08-22,则checkOut_date会自动更新为2015-08-23。 感谢您的任何建议。
答案 0 :(得分:6)
您可以通过向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));
}
});
答案 1 :(得分:1)
首先感谢您的帮助! 我从另一个角度解决了我的问题。 加载场景/视图时,将datepicker设置为当前登记日期和结束日期前一天的日期。 在入住当天,我已禁用当前日期之前和退房日期之后的天数。 退房当天,我已禁用退房日期前的选择日期。
不幸的是我不能发布任何图片,因为我的名声不是10!
但这是控制器类的代码:
doso()+3
10
>>>
这是DateChecker类:
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());});
}
我希望这会有所帮助!