Dynamically update Combobox after selecting item in another ComboBox - JavaFX
Dynamically update Combobox after selecting item in another ComboBox - JavaFX
I have a JavaFX form with two combo boxes populated with Times in 15 min increments for Start and End times. I am trying to get the End time combo box to dynamically repopulate with options when the user selects a start time so that it is not possible for the user to select an End time before the start time while preserving the user's selection if the user has already selected an end time that is still after the start time.
I have been able to get both boxes to populate correctly and correctly retain the user's selection when testing that the code works, however, I cannot get an event to fire correctly for when the user selects a new start time. If I use the onMouseClicked it fires the event when you click on the combo box not when you make a selection, it will work if using the onMouseExit event, but after an annoying delay.
How can I get this even to fire correctly when an item in the ComboBox is selected?
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>
Controller method called when handleSelectStart is called by the action listener
@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));
I am sure I am missing something obvious and simple but I cannot seem to see it. If I missed another question I apologize for the duplicate question but I looked through several articles here and on other sites without figuring it out. Any assistance would be greatly appreciated.
itemsProperty
ComboBox
FilteredList
valueProperty
ComboBox
1 Answer
1
Maybe onAction is what you're looking for?
// --- 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;
After changing my code to use On Action it is working as desired. Like I said I knew I was missing something simple. Thank you.
– KReth
Sep 17 '18 at 20:47
Thanks for contributing an answer to Stack Overflow!
But avoid …
To learn more, see our tips on writing great answers.
Required, but never shown
Required, but never shown
By clicking "Post Your Answer", you agree to our terms of service, privacy policy and cookie policy
You should bind the
itemsProperty
of the secondComboBox
to a binding that provides aFilteredList
based of thevalueProperty
of the firstComboBox
.– Lukas Körfer
Sep 17 '18 at 8:17