Когда JavaFX Combo Box должен запускать свой onAction? - PullRequest
0 голосов
/ 04 июня 2019

У меня есть поле со списком 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...