JavaFX datepicker - 如何在第二个datepicker对象中更新日期?

时间:2015-07-16 16:45:02

标签: javafx datepicker

问题: 我在同一个场景中有两个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。 感谢您的任何建议。

2 个答案:

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

<强>输出:

enter image description here

<强>更新

您可以重新编写代码段

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

我希望这会有所帮助!