2016-03-14 75 views
0

我對JavafX的GUI元素非常滿意,但是,ListView控件(https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/ListView.html)在默認情況下似乎不提供「常用」鍵盤導航。JavaFX ListView鍵盤導航

我可以用箭頭鍵上下移動,但是我不能通過按下相應的鍵來跳轉到以「a」開頭的項目。

雖然這個功能可以很容易地添加,但我想知道它是否可能是內置的?

+1

它不內置。很難看出它是如何構建到一般情況下的:您大概是指從按鍵的字母開始的單元格中顯示的文本,並且通常文本不在列表中的所有項目的內存中(由於細胞再利用)。 (並且在一般情況下,單元甚至可能不顯示文本,但可能使用圖形等等)。 –

+0

謝謝,是的,這是有道理的,是我的第一個假設。這可能是由於我從其他(非Java)GUI工具包中獲得的,因此您可以從中獲得開箱即用的功能。 – snflurry

回答

2

我實現了這種方式:

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; 
      } 
     } 
    } 
});