2014-11-21 65 views
1

我需要做一件簡單的事情。我有一個大的TreeView。和一個菜單項Next和Previous。在下一步,我必須選擇下一個樹項目。樹列表看起來像這樣JavaFx:在TreeView中只需滾動到索引編號時,treeitem不在視圖

-Root(set visible hide is true for root) 
--Parent 1 
----Child 1 
----Child 2 
----Child 3 
--Parent 2 
----Child 1 
----Child 2 

現在通過按一個或下一個菜單項我打電話

myTreeView.getSelectionModel().clearAndSelect(newIndex); 

通過這個我已經管理,選擇下一個項目,通過

myTreeView.getSelectionModel().scrollTo(newIndex) 

我有管理滾動到選定的treeitem。

Problam:

讓我手動選擇第一個項目。之後我按下一個按鈕。現在,這會導致一種奇怪的行爲,即它始終滾動天氣新的選定的樹形視圖處於視圖中(可視區域的邊界)或視野範圍之外。假設我有大量的樹項目。而我的要求只是我只想滾動時發生只有當新的選定的樹項目走出看法。任何機構可以建議如何實現這一目標?

謝謝。

回答

3

這個簡單的事情並不那麼簡單。這是JavaFX中的一個已知問題;見issue RT-18965

根據問題中的評論,我使用它自己的TreeView。請注意 - 正如問題評論 - 我依靠JavaFX內部的類來獲得最終結果。無法保證這些內部類將繼續存在。

首先,創建從一個內部類派生的新的皮膚(​​再次:危險):

import javafx.scene.control.TreeView; 
import com.sun.javafx.scene.control.skin.TreeViewSkin; 
import com.mycompany.mymodel.DataNode; 

/** 
* Only done as a workaround until https://javafx-jira.kenai.com/browse/RT-18965 
* is resolved. 
*/ 
public class FolderTreeViewSkin extends TreeViewSkin<DataNode> 
{ 
    public FolderTreeViewSkin(TreeView<DataNode> treeView) 
    { 
     super(treeView); 
    } 

    public boolean isIndexVisible(int index) 
    { 
     if (flow.getFirstVisibleCell() != null && 
      flow.getLastVisibleCell() != null && 
      flow.getFirstVisibleCell().getIndex() <= index && 
      flow.getLastVisibleCell().getIndex() >= index) 
      return true; 
     return false; 
    } 
} 

其次,外觀應用到TreeView的情況下,你所關心的。

myTreeView.setSkin(new FolderTreeViewSkin(myTreeView)); 

最後,使用新的方法作爲條件scrollTo前:

if (!((FolderTreeViewSkin) myTreeView.getSkin()).isIndexVisible(intThePositionToShow)) 
    myTreeView.scrollTo(intThePositionToShow); 

這是對我工作;我希望它能幫助你或其他人。

相關問題