我希望自動完成功能僅建議與用戶輸入匹配的 START 專案,而不是顯示包含用戶輸入的所有專案。我發現的一種方法是使用 SuggestionProvider,但我無法將它匯入我的班級。
我正在嘗試使用帶有 controlfx 的自動完成 TextField ( TextFields.bindAutoCompletion(...) ),這有點作業但不符合我的意愿。
我有一個 TextField ,您可以在其中開始輸入一個帳戶的號碼,并且自動完成的 TF 會建議一個包含用戶在其號碼中輸入的所有帳戶的串列。例如,如果我開始輸入“4”,建議的串列會顯示“4710....”、“4712...”、...,還有“624...”、“74....” . 我想顯示最后的帳戶是因為它們包含我的輸入。
這不是我想要的,所以我找到了一種方法讓它像我想要的那樣:通過傳遞一個僅包含以用戶輸入開頭的帳戶的串列:
TextFields.bindAutoCompletion(myTextField,
UIUtils.comptesListToStrings(db.getComptesStartingBy(myTextField.getText())));
但是每當輸入文本發生變化時,我都需要更新它。所以我找到了一種使用這樣的 SuggestionProvider 的方法(更新 autoComplete JavaFx?):
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 時,我無法讓它作業。Eclipse 建議我“匯入 'SuggestionProvider' (impl.org.controlfx.autocompletion)”,但是當我這樣做時,我收到如下錯誤:
import org.controlsfx.control.textfield.TextFields; // <-- this works perfectly
import impl.org.controlsfx.autocompletion.SuggestionProvider; // <-- "The type impl.org.controlsfx.autocompletion.SuggestionProvider is not accessible"
Eclipse (img) 建議的匯入
匯入后(img)
我相信這個包與第一行(org.controlsfx.control.textfield.TextFields --> controlfx-11-1-2.jar)在同一個jar中: 依賴樹(img)
我在 Eclipse 上使用 Maven 進行依賴。
我試圖找到一個解決方案,但無法做到。所以我在這里,尋求幫助來解決這個問題。如果有一種方法可以使默認bindAutoCompletion只顯示以用戶輸入開始的帳戶,而不是顯示包含用戶輸入的所有帳戶,那也很棒。
我是Java初學者,這是我在stackoverflow上的第一篇文章,所以請原諒我的低知識。
uj5u.com熱心網友回復:
根據設計,這些impl.*包不是公共 API 的一部分,也無法訪問。
相反,bindAutoCompletion使用需要Callback.
這Callback是一個從建議請求到建議集合的函式。當文本欄位中的文本發生變化時將呼叫它,您可以使用該getUserText()方法從請求中檢索文本。這樣,您可以使用任意邏輯將文本欄位文本映射到建議串列。
這是一個快速而骯臟的示例,可確保建議的文本以文本欄位中的文本開頭:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import org.controlsfx.control.textfield.TextFields;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class HelloApplication extends Application {
@Override
public void start(Stage stage) throws IOException {
TextField textField = new TextField();
List<String> allItems = new ArrayList<>();
for (int i = 1 ; i <= 100; i ) allItems.add(String.valueOf(i));
TextFields.bindAutoCompletion(
textField,
suggestionRequest -> matchingItems(allItems, suggestionRequest.getUserText())
);
BorderPane root = new BorderPane(textField);
Scene scene = new Scene(root, 800, 500);
stage.setScene(scene);
stage.show();
}
private List<String> matchingItems(List<String> allItems, String prefix) {
List<String> matches = new ArrayList<>();
for (String s : allItems) {
if (s.startsWith(prefix)) {
matches.add(s);
}
}
return matches ;
}
public static void main(String[] args) {
launch();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/529596.html
上一篇:重新排序.csv檔案串列中的列
下一篇:流查找第一個多個選項
