JavaFx: в TreeView нужно только прокрутить до номера индекса, когда treeitem находится вне представления
Мне нужно сделать простую вещь. У меня большой TreeView. и пункт меню Next и Previous. Далее я должен выбрать следующий элемент дерева. Список дерева выглядит так
-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)
мне удалось прокрутить до выбранного элемента дерева.
Problam:
Позвольте мне выбрать первый пункт вручную. После этого я нажимаю кнопку "Далее". Теперь это вызывает странное поведение, заключающееся в том, что он всегда прокручивает информацию о новом выбранном элементе дерева в поле зрения (границы видимой области) или вне поля зрения. допустим, у меня есть большой список элементов дерева. и мое требование - я хочу, чтобы прокрутка происходила только тогда, когда новый выбранный элемент дерева исчезал из поля зрения. кто-нибудь может подсказать, как этого добиться??
Благодарю.
1 ответ
Эта простая вещь не так проста. Это известная проблема в 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;
}
}
Во-вторых, примените этот скин к экземпляру TreeView, который вас интересует.
myTreeView.setSkin(new FolderTreeViewSkin(myTreeView));
Наконец, используйте новый метод в качестве условия перед scrollTo
:
if (!((FolderTreeViewSkin) myTreeView.getSkin()).isIndexVisible( intThePositionToShow ))
myTreeView.scrollTo( intThePositionToShow );
Это то, что сработало для меня; Я надеюсь, что это может помочь вам или кому-либо еще.