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 );

Это то, что сработало для меня; Я надеюсь, что это может помочь вам или кому-либо еще.

Другие вопросы по тегам