Динамически обновлять список флажков в зависимости от изменения даты (значения) - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь создать простой контрольный список с датами начала, который отвечает ползунку времени, в котором указана дата.

  • У каждой задачи есть дата начала.

  • Каждый флажок задачи должен отображаться, только если истек срок начала задачи.

Контрольный список выглядит так при инициализации

checklist with time slider

Как мне обновить контрольный список для ответа на ползунок времени?

Я понимаю, что мне нужно где-то добавить слушателя или сделать вызов, чтобы обновить элементы пользовательского интерфейса в сцене где-нибудь, но яне знаю, с чего начать.

Я пытался обновить список, использованный для создания, но он не обновляет элементы пользовательского интерфейса, поскольку они уже созданы.

ProjectChecklist.java

public class ProjectChecklist extends Application {
  Group root = new Group();
  Scene scene = new Scene(root, 600, 300);
  VBox vbox = new VBox();
  HBox hbox = new HBox();
  ScrollPane scrollPane = new ScrollPane();


  taskList = getAllTasks(PROJECT_FILENAME);
  todayDate = LocalDate.now();
  sliderStartDate = taskList.get(0).getStartDate();
  LocalDate sliderEndDate = taskList.get(taskList.size() - 1).getEndDate();

  long days = ChronoUnit.DAYS.between(sliderStartDate, sliderEndDate);
  long daysFromToday = ChronoUnit.DAYS.between(sliderStartDate, todayDate);

  slider = new Slider(0, days, 1);
  slider.setValue(daysFromToday);
  sliderValue = new Label(LocalDate.now().toString());
  slider.setMajorTickUnit(1);
  slider.setShowTickLabels(true);

  scrollPane.setVbarPolicy(ScrollBarPolicy.AS_NEEDED);
  scrollPane.setHbarPolicy(ScrollBarPolicy.AS_NEEDED);

  slider.valueProperty().addListener(new ChangeListener<Number>() {
  public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
    double daysValue = Math.round(newValue.doubleValue());
    LocalDate newDate = (sliderStartDate.plusDays((long) daysValue));
    slider.setValue(daysValue);
    sliderValue.setText(newDate.toString());
  }
  int taskNumber = 1;

  for (ChecklistTask task : taskList) {
    if (!task.getStartDate().isAfter(todayDate)) {
      CheckBox newCB = new CheckBox();
      newCB.setText("task " + taskNumber++ + ": " + task.getDescription());
      vbox.getChildren().add(newCB);
    }
  }
  vbox.getChildren().add(slider);
  vbox.getChildren().add(sliderValue);
  hbox.getChildren().add(vbox);
  hbox.setSpacing(40);
  hbox.setPadding(new Insets(10, 10, 10, 10));

  scrollPane.setContent(hbox);
  scrollPane.setPrefSize(600, 300);
  scrollPane.setFitToHeight(true);

  root.getChildren().add(scrollPane);

  primaryStage.setTitle("Bennington checklist");
  primaryStage.setScene(scene);
}

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

ChecklistTask.java


import java.time.LocalDate;
import java.util.UUID;

public class ChecklistTask{
    private UUID id;
    private String description;
    private LocalDate startDate;
    private LocalDate endDate;

    public ChecklistTask() {
        this.id = UUID.randomUUID();
    }

    public UUID getId() {
        return id;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public LocalDate getEndDate() {
        return endDate;
    }

    public void setEndDate(LocalDate endDate) {
        this.endDate = endDate;
    }

    public LocalDate getStartDate() {
        return startDate;
    }

    public void setStartDate(LocalDate startDate) {
        this.startDate = startDate;
    }

}

1 Ответ

0 голосов
/ 17 апреля 2019

Я бы предложил использовать ListView, который поддерживается FilteredList, где предикат сравнивает значение ползунка с датой ChequelistTask.Изменение значения ползунка автоматически обновит предикат для фильтрации списка, в котором дата начала> выбрана дата ползунка.Фильтрация позаботится об обновлении списка соответствующим образом, без необходимости перестраивать содержимое VBox.

Вот пример обновления предиката при изменении чего-либо: JavaFX FilteredList, фильтрация на основе свойств элементов всписок

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...