我實現了這種方式:
private String searchText = "";
private long searchTextLastTyped = 0;
private int searchTextSkip = 0;
...
listView.setOnKeyTyped(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
if (event.getCharacter() != null) {
//in case of same character typed more times = search next occurence
if (searchText.equals(event.getCharacter())) {
searchTextSkip++;
} else {
//in case typing more characters relatively quickly = append character
if (System.currentTimeMillis() - searchTextLastTyped < 1000) {
searchText += event.getCharacter();
//typing new character after pause = new search
} else {
searchText = event.getCharacter();
}
}
searchTextLastTyped = System.currentTimeMillis();
boolean found = false;
int skipped = 0;
for (T item : getItems()) {
if (getTextValue(item).toUpperCase().startsWith(searchText.toUpperCase())) {
if (searchTextSkip > skipped) {
skipped++;
continue;
}
setValue(item);
found = true;
break;
}
}
//reset to first occurence
if (!found) {
searchTextSkip = 0;
}
}
}
});
它不內置。很難看出它是如何構建到一般情況下的:您大概是指從按鍵的字母開始的單元格中顯示的文本,並且通常文本不在列表中的所有項目的內存中(由於細胞再利用)。 (並且在一般情況下,單元甚至可能不顯示文本,但可能使用圖形等等)。 –
謝謝,是的,這是有道理的,是我的第一個假設。這可能是由於我從其他(非Java)GUI工具包中獲得的,因此您可以從中獲得開箱即用的功能。 – snflurry