JavaFx:当Treeitem不在视图中时,在TreeView中仅需要滚动到索引号

Mub*_*her 3 java javafx javafx-8

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

-Root(set visible hide is true for root)
 --Parent 1
 ----Child 1
 ----Child 2
 ----Child 3
 --Parent 2
 ----Child 1
 ----Child 2
Run Code Online (Sandbox Code Playgroud)

现在,通过按“下一个”或“上一个”菜单项,我致电

myTreeView.getSelectionModel().clearAndSelect(newIndex);
Run Code Online (Sandbox Code Playgroud)

通过这个,我设法选择下一个项目,并通过

myTreeView.getSelectionModel().scrollTo(newIndex) 
Run Code Online (Sandbox Code Playgroud)

我已经设法滚动到选定的treeitem。

问题:

让我手动选择第一项。之后,我按下一步按钮。现在,这将导致一个奇怪的行为,即它总是在新的选定树状对象在视图中(可查看区域的边界)或视图外滚动。假设我有很多树木项目。我的要求是我只希望仅在新选择的树项不可见时才发生滚动。任何人都可以建议如何实现这一目标吗?

谢谢。

Ahm*_*med 6

这个简单的事情并不是那么简单。这是JavaFX中的一个已知问题。参见问题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;
    }
}
Run Code Online (Sandbox Code Playgroud)

其次,将该皮肤应用于您关注的TreeView实例。

myTreeView.setSkin(new FolderTreeViewSkin(myTreeView));
Run Code Online (Sandbox Code Playgroud)

最后,在以下条件之前使用new方法作为条件scrollTo

if (!((FolderTreeViewSkin) myTreeView.getSkin()).isIndexVisible( intThePositionToShow ))
    myTreeView.scrollTo( intThePositionToShow );
Run Code Online (Sandbox Code Playgroud)

这就是对我有用的东西;我希望它可以帮助您或其他任何人。