如何获得JavaFx Combobox来响应用户键入?

时间:2018-08-24 00:08:24

标签: java javafx

我正在编写一个程序,其中涉及在组合框中键入用户类型,并且项目列表应更改以反映框中的文本(类似于在您键入Google时自动完成)

但是,在按Enter之前,我的组合框不会更新。键入常规键时,它似乎没有更新。我曾尝试将各种类型的侦听器添加到组合框中,但没有一个可以解决问题。

这是最成功的代码段。从fxml代码调用:onKeyReleased =“#keyReleased”。它可以正常工作,但仅在按Enter键时才执行。

public void keyReleased() throws SQLException, ClassNotFoundException
{
    String coname = custconame_combo.getValue();

    scriptHandler = new ScriptHandler();

    custconame_combo.getItems().clear();
    int i = 0;
    for (String s : scriptHandler.searchCustomer(coname))
    {
        System.out.println(s);
        custconame_combo.getItems().add(s);

        custconame_combo.show();

        i += 1;
    }
}

我搜索过很多东西,但似乎仍然无法解决这个问题。

2 个答案:

答案 0 :(得分:0)

自从我解决了问题之后,我将分享发现的内容。

第三方库提供了最简单的解决方案。我参加了JFoenix的自动补全课程。它具有我一直在寻找的功能,并且感觉不像我在尝试重新发明轮子。

此答案对我的搜索非常有帮助:JavaFX TextField Auto-suggestions

答案 1 :(得分:0)

有类似的问题。 onKeyReleased方法无法根据需要进行响应。使用EventHandler。 这是我的代码(经过测试,效果很好):

currencySymbolComboBox.setOnKeyPressed(event -> {
        if(currencySymbolComboBox.isShowing()) {
            if(event.getCode().isLetterKey()) {
                currencyComboBoxKeysTyped += event.getCode().getName();

                Optional<String> os = currecnySymbolsObservableList.stream()
                        .filter(symbol -> symbol.startsWith(currencyComboBoxKeysTyped))
                        .findFirst();

                if (os.isPresent()) {
                    int ind = currecnySymbolsObservableList.indexOf(os.get());
                    ListView<String> lv = ((ComboBoxListViewSkin) currencySymbolComboBox.getSkin()).getListView();
                    lv.getFocusModel().focus(ind);
                    lv.scrollTo(ind);
                    currencySymbolComboBox.getSelectionModel().select(ind);
                } else {
                    currencyComboBoxKeysTyped = currencyComboBoxKeysTyped
                            .substring(0, currencyComboBoxKeysTyped.length() - 1);
                }
            }
            else if(event.getCode() == KeyCode.BACK_SPACE) {
                if(currencyComboBoxKeysTyped.length() > 0) {
                    currencyComboBoxKeysTyped = currencyComboBoxKeysTyped
                            .substring(0, currencyComboBoxKeysTyped.length() - 1);
                }
            }
        }
    });

    currencySymbolComboBox.showingProperty().addListener((observable, oldValue, newValue) -> {
        if(!currencySymbolComboBox.isShowing()) {
            currencyComboBoxKeysTyped = "";
        }
    });