У меня есть поле со списком JavaFX, в котором после выбора элемента заполняется другое поле со списком соответствующих элементов.Итак, я установил onAction для моего поля со списком handleSelect()
, и именно эта функция заботится о заполнении второго поля со списком.
Когда должен запускаться handleSelect()
?Когда я выбираю элемент из поля со списком, handleSelect()
срабатывает, как и ожидалось.Тем не менее, handleSelect()
также срабатывает, когда я нажимаю на второе поле со списком, даже если это второе поле со списком не имеет установленного OnAction.Кроме того, handleSelect()
срабатывает, когда я щелкаю в другом окне.
Это ожидаемое поведение onAction для поля со списком JavaFX?
Кстати, раньше это работало, а теперь - нет, и я не знаю почему.Вот код ...
У меня есть два комбинированных списка, один называется comboVariable, а другой - comboOperator.Когда переменная выбирается из comboVariable, поле comboOperator заполняется реляционными операторами, которые имеют смысл для выбранного типа переменной.Для этого я создал класс UserVariable и тип перечисления RelationOperator.
@FXML ComboBox<ComboBoxItem<String>> comboVariable;
@FXML ComboBox<SimpleConditional.RelationalOperator> comboOperator;
public void initWindow()
{
setContents();
}
public void setContents()
{
System.out.println("setContents called");
comboVariable.getItems().clear();
if (getVars().size() > 0) {
for(Map.Entry<String, UserVariable<? extends Comparable<?>>> varEntry : getVars().entrySet()) {
comboVariable.getItems().add(new ComboBoxItem<String>(varEntry.getKey(), true));
}
}
// make comboVariable autocomplete
FxUtil.autoCompleteComboBox(comboVariable,
(typedText, itemToCompare) -> itemToCompare.getName().toLowerCase().contains(typedText.toLowerCase())
);
}
@FXML public void handleSelect()
// This method is called whenever a variable name is selected in the comboVariable combobox
{
System.out.println("handleSelectVar called");
ComboBoxItem<String> selectedItem = FxUtil.getComboBoxValue(comboVariable);
if (selectedItem == null) return;
String varName = selectedItem.getName();
UserVariable<?> selectedVar = getVar(varName);
if (selectedVar == null) return;
myVarType = selectedVar.getType();
setComboAndLabelBasedOnType();
}
private void setComboAndLabelBasedOnType()
// This helper function is called by handleSelect()
// It sets the available operators to be == and != for Strings and Bool and makes all operators available for
// Doubles and Integers.
{
System.out.println("setComboAndLabelBasedOnType called");
comboOperator.getItems().clear();
switch (myVarType) {
case STRING:
case BOOL:
comboOperator.getItems().addAll(RelationalOperator.EQ, RelationalOperator.NE);
break;
case DOUBLE:
case INT:
comboOperator.getItems().addAll(RelationalOperator.EQ, RelationalOperator.NE,
RelationalOperator.GT, RelationalOperator.GE, RelationalOperator.LT,
RelationalOperator.LE);
break;
}
}