2015-03-17 11 views
0

Я здесь, потому что мои исследования и тестирование ни к чему не привели.Перетаскивание JavaFX для изменения узлов

Я сделал небольшое приложение для календаря, и теперь я хочу улучшить пользовательский интерфейс с помощью приятных элементов управления. Я пытаюсь создать интерфейс, в котором вы можете создать событие, перетащив его (как вы можете сделать в повестке дня Google, на самом деле это школьный проект, и я хочу воспроизвести представление на этой неделе).

Для этого я попробовал этот подход: Для каждой ячейки области (в GridPane, которые содержат VBoxes) я придаю обработчики, которые обеспечивают достижение этой функции (setOnDragDetected, setOnMouseDragEntered и setOnMouseDragReleased). И это хорошо работает, но в некоторых случаях это не работает (если мышь перемещается по другому событию, у которого нет обработчиков, функция перетаскивания останавливается).

Поскольку я видел это слишком тяжелым и поддающимся подделке (3 обработчика x 7 столбцов x 48 строк = 1008 обработчиков !!), я думал о другом подходе, но я новичок в javaFX, и я не знаю, если есть и другой механизм для этого. (Я думал о прозрачной макете/панели, которая будет обрабатывать эту функцию и действовать как «сенсорный экран» поверх моего приложения, но я не нашел удовлетворительных ответов). Может ли кто-нибудь просветить меня об этой проблеме? Для хорошего примера того, что я пытаюсь достичь, вы принимаете поведение программы Google для создания события с помощью мыши (мне не нужно управлять перекрытием события). Заранее спасибо !! Я размещаю изображение того, как выглядит фактический вид. Actual view

+1

Я бы не стал слушать события перетаскивания на отдельные ячейки, но в целом GridPane и преобразовывать координаты GridPane в координаты ячеек, где это необходимо. –

+0

Lol кажется настолько очевидным. Я попробую! –

+1

Я бы предположил, что перевод координат может быть сложным и, возможно, дорогим, как (по крайней мере, в принципе) вам придется протестировать все «временные интервалы» в представлении. (Хотя я бы предположил, что есть некоторые хорошие способы избежать этого.) С другой стороны, я не слишком убежден, что у ~ 1000 обработчиков или около того, которые в основном не вызваны очень сильно, это большая сделка. Вот [очень простой пример] (https://gist.github.com/james-d/c4a2cf66efecbf3aa362), который просто позволяет выбирать диапазон временных интервалов, используя этот подход. –

ответ

0

Итак, как Tomas Mikula предложить мне, что я только приложенный мои обработчики к GridPane (а не к каждой «ячейки», как я сделал ранее): setOnDragDetected, setOnMouseDragOver, setOnMouseDragReleased и setOnMouseDragExited.

Поскольку обработчики запускаются на GridPane, перемещение мыши над другим элементом не останавливает функцию.

С этим я сократил количество обработчиков, упростил код (так как мне не нужно управлять дополнительными поведениями как движущими силами над другим ребенком).

Спасибо!

Смежные вопросы