Dynamically update Combobox after selecting item in another ComboBox - JavaFX
我有一个 JavaFX 表单,其中包含两个组合框,其中填充了以 15 分钟为增量的时间,分别表示开始时间和结束时间。我试图让结束时间组合框在用户选择开始时间时动态重新填充选项,这样用户就不可能在开始时间之前选择结束时间,同时保留用户的选择,如果用户已经选择了一个仍然在开始时间之后的结束时间。
在测试代码是否有效时,我已经能够正确填充两个框并正确保留用户的选择,但是,当用户选择新的开始时间时,我无法正确触发事件。如果我使用 onMouseClicked 它会在您单击组合框而不是在您进行选择时触发该事件,如果使用 onMouseExit 事件它会起作用,但是在令人讨厌的延迟之后。
如何在选择组合框中选择的项目时,我甚至可以正确地发射?
FXML
1 2 3 4 5 6 7 8 9 10 | <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时调用的控制器方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | @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)); } } |
我确信我遗漏了一些明显而简单的东西,但我似乎看不到它。如果我错过了另一个问题,我为重复的问题道歉,但我在这里和其他网站上浏览了几篇文章而没有弄清楚。任何帮助将不胜感激。
也许 onAction 就是您想要的?
1 2 3 4 5 6 7 8 9 10 11 | // --- 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; } |