【问题标题】:Dynamically update Combobox after selecting item in another ComboBox - JavaFX在另一个 ComboBox 中选择项目后动态更新 Combobox - JavaFX
【发布时间】:2018-09-17 05:30:36
【问题描述】:

我有一个 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>

action listener调用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));
    }
}

我确定我遗漏了一些明显而简单的东西,但我似乎看不到它。如果我错过了另一个问题,我为重复的问题道歉,但我在这里和其他网站上浏览了几篇文章而没有弄清楚。任何帮助将不胜感激。

【问题讨论】:

  • 您应该将第二个ComboBoxitemsProperty 绑定到一个基于第一个ComboBoxvalueProperty 提供FilteredList 的绑定。

标签: javafx combobox java-8 fxml


【解决方案1】:

也许 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; }

【讨论】:

  • 将我的代码更改为使用 On Action 后,它可以正常工作。就像我说的,我知道我错过了一些简单的东西。谢谢。
猜你喜欢
  • 1970-01-01
  • 2020-04-12
  • 2017-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多