从DatePicker控件中排除特定日期的问题

时间:2018-12-27 16:55:41

标签: java javafx

这是我的代码,这就是它的工作方式

  1. Listener收听VIN​​文本字段中的内容并读取此数据
  2. 如果我输入的VIN号与我的房租清单程序中的VIN号相同,我将遍历CarFx列表,并开始检查哪些日期不可租房
  3. 我将不可用的日期添加到列表中
  4. 从上述日期的DatePicker中排除

我做错了什么?

       List<LocalDate> unavailableDates = new ArrayList<>();
       unavailableDates.add(LocalDate.parse("2018-12-31")); //for example

        vinTextField.textProperty().addListener(new ChangeListener<String>() {
        @Override
        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {

            System.out.println(" Text Changed to  " + newValue + ")\n");

        }

    });

    for (CarFx lcs : carFxList) {

        if (lcs.getVin().equals(vinTextField.getText())) {

            LocalDate da = lcs.getReleaseDate();
            int nr = lcs.getDays(); // number of days for which car is reserved

            for (int i = 1; i < nr; i++) {

                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM d yyyy");
                unavailableDates.add(da);
                da.plusDays(i);
            }

        }

    }

    releaseDatePicker.setDayCellFactory(picker -> new DateCell() {
        @Override
        public void updateItem(LocalDate date, boolean empty) {
            super.updateItem(date, empty);
            LocalDate today = LocalDate.now();

            setDisable(empty || date.compareTo(today) < 0); // I am also excluding all days in the past
            if (date != null && !empty) {

                // Compare date to List
                if (unavailableDates.contains(date)) {
                    setDisable(true);

                }
            }
        }
    });

    this.releaseDatePicker.valueProperty()
            .bindBidirectional(this.carModel.getCarFxObjectProperty().releaseDateProperty());

1 个答案:

答案 0 :(得分:0)

以下MCVE也许会引导您朝正确的方向前进。我建议创建一个没有可用日期的列表,然后在您的DateCellFactory中比较该列表。

例如,此List可能来自您的CarFx对象(每辆车包含无法出租的日期列表)。

您的问题没有提供足够的代码来提供完整的解决方案,因为可用的上下文很少。

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.DateCell;
import javafx.scene.control.DatePicker;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

public class DateCellsSample extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {

        // Simple interface
        VBox root = new VBox(5);
        root.setPadding(new Insets(10));
        root.setAlignment(Pos.CENTER);

        // Create a list of Dates that are unavailable (this list can be updated as needed)
        List<LocalDate> unavailableDates = new ArrayList<>();
        unavailableDates.add(LocalDate.parse("2018-12-30"));
        unavailableDates.add(LocalDate.parse("2018-12-31"));
        unavailableDates.add(LocalDate.parse("2019-01-01"));
        unavailableDates.add(LocalDate.parse("2019-01-02"));
        unavailableDates.add(LocalDate.parse("2019-01-03"));
        unavailableDates.add(LocalDate.parse("2019-01-04"));
        unavailableDates.add(LocalDate.parse("2019-01-05"));

        // Create our DatePicker
        DatePicker datePicker = new DatePicker();

        // Set the DatePicker to only allow selection of dates NOT in the unavailableDates List
        datePicker.setDayCellFactory(picker -> new DateCell() {
            @Override
            public void updateItem(LocalDate date, boolean empty) {
                super.updateItem(date, empty);
                if (date != null && !empty) {

                    // Compare date to List
                    if (unavailableDates.contains(date)) {
                        setDisable(true);
                    }
                }
            }
        });

        root.getChildren().add(datePicker);

        // Show the Stage
        primaryStage.setWidth(300);
        primaryStage.setHeight(300);
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }
}
  

结果:

screenshot