Прокрутка узла дерева до верхней части панели прокрутки - PullRequest
3 голосов
/ 10 марта 2011

У меня есть JTree с более чем 8 узлами дерева (листьями).Требование заключается в том, что если пользователь щелкает узел дерева, выбранный узел дерева автоматически прокручивается в верхнюю часть панели прокрутки с любой позиции.Пожалуйста, помогите!

Ответы [ 3 ]

3 голосов
/ 06 ноября 2012

Как уже отмечалось: все методы scrollXXToVisible прокручиваются так, что данный XX виден где-то , они не поддерживают более точное управление, как f.i. msgstr "должен быть первый узел в видимой области".

Вы должны реализовать эту функцию самостоятельно, что-то вроде

TreePath path = tree.getSelectionPath();
if (path == null) return;
Rectangle bounds = tree.getPathBounds(path);
// set the height to the visible height to force the node to top 
bounds.height = tree.getVisibleRect().height;
tree.scrollRectToVisible(bounds);

Остерегайтесь: действия в ответ на событие мыши на узле могут раздражать пользователя, поскольку он перемещает цель из-под ног.

2 голосов
/ 10 марта 2011

Используйте метод scrollRectToVisible для фактического JTree.

Пример:

tree.scrollRectToVisible(new Rectangle(0,0));
1 голос
/ 06 ноября 2012

Этот вопрос задавался давным-давно, и я не знаю, нужно ли вам это по-прежнему ...

Я понимаю, что у вас есть проблема, проблема в том, что слушатели выбора дерева не делаютработать, как вы могли ожидать.Вы должны обнаружить событие щелчка, зарегистрировав слушателя мыши.Примерно так:

tree = new JTree();
    tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
    MouseListener ml = new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            int selRow = tree.getRowForLocation(e.getX(), e.getY());
            currentRow = selRow;
            TreePath selPath = tree.getPathForLocation(e.getX(), e.getY());
            if (selRow != -1) {
                DefaultMutableTreeNode node = new DefaultMutableTreeNode(selPath.getLastPathComponent());
                if (node != null && node.isLeaf()) {
                    String stringId = '<sting-id-of-node-you-wish-to-scroll-to>';
                    TreePath tp = tree.getNextMatch(stringId, currentRow, Position.Bias.Forward);
                    if (tp == null) {
                        tp = tree.getNextMatch(stringId, currentRow, Position.Bias.Backward);
                    }
                    tree.setSelectionPath(tp);
                    tree.scrollPathToVisible(tp);
                }
            }
        }
    };
    tree.addMouseListener(ml);

Ура!

...