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.






You should bind the itemsProperty of the second ComboBox to a binding that provides a FilteredList based of the valueProperty of the first ComboBox.

– Lukas Körfer
Sep 17 '18 at 8:17


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

Popular posts from this blog

𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

Edmonton

Crossroads (UK TV series)