我正在编写一个程序,其中涉及在组合框中键入用户类型,并且项目列表应更改以反映框中的文本(类似于在您键入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;
}
}
我搜索过很多东西,但似乎仍然无法解决这个问题。
答案 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 = "";
}
});