Динамически обновлять Combobox после выбора элемента в другом ComboBox - JavaFX - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть форма JavaFX с двумя полями со списком, заполненными временами с шагом 15 минут для времени начала и окончания. Я пытаюсь получить поле со списком Время окончания для динамического повторного заполнения опциями, когда пользователь выбирает время начала, чтобы пользователь не мог выбрать Время окончания до времени начала, сохраняя выбор пользователя, если пользователь уже выбрал время окончания, которое все еще после времени начала.

Мне удалось заставить оба поля заполняться правильно и правильно сохранять выбор пользователя при проверке работоспособности кода, однако я не могу получить событие для корректного срабатывания, когда пользователь выбирает новое время запуска. Если я использую onMouseClicked, он запускает событие, когда вы нажимаете на поле со списком, не когда вы делаете выбор, это будет работать при использовании события onMouseExit, но после раздражающей задержки.

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

FXML

 <ComboBox id="Start Dropdown" fx:id="cbStart" onMouseClicked="#handleSelectStart" prefWidth="150.0" GridPane.columnIndex="5" GridPane.rowIndex="4">
       <GridPane.margin>
          <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
       </GridPane.margin>
 </ComboBox>
 <ComboBox id="End Dropdown" fx:id="cbEnd" prefWidth="150.0" GridPane.columnIndex="8" GridPane.rowIndex="4">
       <GridPane.margin>
          <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
       </GridPane.margin>
 </ComboBox>

Метод контроллера вызывается, когда handleSelectStart вызывается слушателем действия

@FXML
private void handleSelectStart(MouseEvent event){
    //Get the currently selected Start time from Start ComboBox
    LocalTime time = LocalTime.parse(cbStart.getValue(), timeDTF);

    //Store the current Selected End time for later comparison
    String currentEnd = cbEnd.getSelectionModel().getSelectedItem();

    //Clear out existing options from End Combo Box ObservableList
    availEndTimes.clear();

    do{
        availEndTimes.add(time.format(timeDTF));
        time = time.plusMinutes(15);
    } while(!time.equals(LocalTime.of(17, 15)));

    availEndTimes.remove(0);

    if(availEndTimes.contains(currentEnd)){
       cbEnd.setItems(availEndTimes);
       cbEnd.getSelectionModel().select(currentEnd);
       //setValidEndTimes();
    } else {
       cbEnd.setItems(availEndTimes);
       cbEnd.getSelectionModel().select(availEndTimes.get(0));
    }
}

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

1 Ответ

0 голосов
/ 17 сентября 2018

Может быть, onAction - это то, что вы ищете?

// --- On Action
/**
 * The ComboBox action, which is invoked whenever the ComboBox
 * {@link #valueProperty() value} property is changed. This
 * may be due to the value property being programmatically changed, when the
 * user selects an item in a popup list or dialog, or, in the case of
 * {@link #editableProperty() editable} ComboBoxes, it may be when the user
 * provides their own input (be that via a {@link TextField} or some other
 * input mechanism.
 */
public final ObjectProperty<EventHandler<ActionEvent>> onActionProperty() { return onAction; }
...