JavaFx:在TreeView中只需要在treeitem超出View时滚动到索引号

时间:2014-11-21 10:57:19

标签: java javafx javafx-8

我需要做一件简单的事情。我有一个很大的TreeView。以及菜单项Next和Previous。在Next我必须选择下一个Tree Item。树列表看起来像这样

-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:

让我手动选择第一项。在此之后我按下一个按钮。现在,这会导致一种奇怪的行为,它总是滚动天气新的选定树状图在视图中(视图区域的边界)或视图外。假设我有大量的树项目列表。而我的要求就是我只想在新选择的树项目不在视图时才发生滚动。可以任何身体建议如何实现这一点?

感谢。

1 个答案:

答案 0 :(得分:4)

这个简单的事情并非如此简单。这是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 );

这对我有用;我希望它可以帮助你或其他任何人。