我需要做一件简单的事情。我有一个很大的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。
让我手动选择第一项。在此之后我按下一个按钮。现在,这会导致一种奇怪的行为,它总是滚动天气新的选定树状图在视图中(视图区域的边界)或视图外。假设我有大量的树项目列表。而我的要求就是我只想在新选择的树项目不在视图时才发生滚动。可以任何身体建议如何实现这一点?
感谢。
答案 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 );
这对我有用;我希望它可以帮助你或其他任何人。