更新自动完成 JavaFx?

Update autoComplete JavaFx?

我目前正在使用 ControlFx 的 Autcomplete TextField 开发 JavaFX project.I。每次我在数据库 table 中添加新行时,它都应该更新 Autocomplete ,我这样做了,但我的问题是显示双 Context-Menu ,我们可以说双自动完成,因为我调用创建自动完成的方法,每次在 table.[=15 中添加新元素=]

当我单击一个选项卡时 editBill 我调用此方法:

public void showEditBill() {
    if (!BillPane.getTabs().contains(EditBillTab)) {
        BillPane.getTabs().add(EditBillTab);
    }
    SingleSelectionModel<Tab> selectionModel = BillPane.getSelectionModel();
    selectionModel.select(EditBillTab);
    /*it should remove the old autocomplete from textfield*/
    pushBills(); //Call for cheking new items
}

pushBills 方法 () :

public void pushBills() {    
    ArrayList list = new ArrayList<>();
    bills = new BillHeaderDao().FindAll();
    for (int i = 0; i < bills.size(); i++) {
        list.add(bills.get(i).getIdClient());
    }
    //How can i remove the old bind before bind again
    autoCompletionBinding = TextFields.bindAutoCompletion(SearchBill, SuggestionProvider.create(list));
}

如何删除旧的自动完成并绑定新的自动完成?

这样做可以解决问题: 而不是:TextFields.bindAutoCompletion(textField, list); ,试试这个:

List<String> strings = new ArrayList<>();

然后通过以下方式在您的 textField 与列表之间创建绑定:

new AutoCompletionTextFieldBinding<>(textField, SuggestionProvider.create(strings)); 

因此,任何更改(包括从列表中删除)都将反映在 textField 的自动完成中; 当用户在 textField 中输入一些文本时,您将动态过滤建议,显示在弹出窗口中;

前段时间我遇到了同样的问题,我尝试按照@MaxKing 提到的那样做,但它没有用。我设法给了它一个解决方案,尽管我认为这不是正确的方法。

// 处理旧绑定并重新创建新绑定

autoCompleteBinding.dispose();

autoCompleteBinding = TextFields.bindingAutoCompletion(TextField,List);

试试这个:

public void pushBills() {
    ArrayList list = new ArrayList<>();
    bills = new BillHeaderDao().FindAll();

    for (int i = 0; i < bills.size(); i++) {
        list.add(bills.get(i).getIdClient());
    }
    autoCompletionBinding.dispose();
    autoCompletionBinding = TextFields.bindAutoCompletion(SearchBill, SuggestionProvider.create(list));
}

无论如何,如果您需要保留 AutoCompletionTextFieldBinding 对象的实例,从而避免使用:

autoCompleteBinding = TextFields.bindingAutoCompletion(TextField,List);

,这会改变实例,我们可以更深入一点,使用这个:

// let's suppose initially we have this possible values:
Set<String> autoCompletions = new HashSet<>(Arrays.asList("A", "B", "C"));
SuggestionProvider<String> provider = SuggestionProvider.create(autoCompletions);
new AutoCompletionTextFieldBinding<>(textField, provider);

// and after some times, possible autoCompletions values has changed and now we have:
Set<String> filteredAutoCompletions = new HashSet<>(Arrays.asList("A", "B"));

provider.clearSuggestions();
provider.addPossibleSuggestions(filteredAutoCompletions);

因此,通过 SuggestionProvider,我们有 "updated" 自动完成值。 为避免建议菜单加倍,请勿再次使用(第二次):

TextFields.bindAutoCompletion(..)

为了提供对自动完成建议列表的更新,保留对 SuggestionProvider 的引用并改为更新建议提供者:

TextField textField = new TextField();
SuggestionProvider suggestionProvider = SuggestionProvider.create(new ArrayList());
new AutoCompletionTextFieldBinding<>(textField, suggestionProvider);

当您要更新建议列表时:

List<String> newSuggestions = new ArrayList();
//(add entries to list)
suggestionProvider.clearSuggestions();
suggestionProvider.addPossibleSuggestions(newSuggestions);