JTree drop index между узлами - PullRequest
4 голосов
/ 21 марта 2012

Я реализовал перетаскивание в моем JTree, и оно работает, но я нахожу это немного запутанным.На рисунке я показываю, как расположение отбрасывания между item4 и item5 может варьироваться в зависимости от того, как далеко вы находитесь между узлами.Я предполагаю, что это потому, что границы строк для item4 и item5 встречаются посередине между ними, и в зависимости от того, на какой стороне вы находитесь, вы на самом деле в другой строке.

Отс точки зрения пользователя, я думаю, что это не естественно.Я думаю, что если я упаду над узлом, падение произойдет над ним.Если бы я опустился ниже узла, падение произошло бы ниже него.Есть ли способ настроить такое поведение?

enter image description here

РЕДАКТИРОВАТЬ: Добавление кода, чтобы показать, как получить место размещения

    DropLocation dropLoc = support.getDropLocation();
    Point dropPoint = dropLoc.getDropPoint();
    tree.getTree().getPathForLocation(dropPoint.x, dropPoint.y);

Обратите внимание, что support является TransferSupport объектом

РЕДАКТИРОВАТЬ 2: Я, казалось, решил эту проблему, проверив, находится ли точка падения выше или ниже середины узла.Тогда я могу сказать, было ли падение выше или ниже какого узла.

1 Ответ

2 голосов
/ 26 марта 2012

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

        public void dragOver(DropTargetDragEvent dtde)
        {
            Point dropPoint = dtde.getLocation();
            TreePath path = tree.getPathForLocation(dropPoint.x, dropPoint.y);
            Rectangle pathBounds = tree.getPathBounds(path);
            Rectangle topHalf = new Rectangle(pathBounds.x, pathBounds.y, pathBounds.width, pathBounds.height / 2);
            if (topHalf.contains(dropPoint))
            {
                System.out.println("top half");
            }
            else
            {
                System.out.println("bottom half");
            }
         }
...