Трудно сказать, не видя структуру вашего кода.Но у меня была похожая проблема при работе с инструментом моделирования uml, написанным на javafx, поэтому моё решение может вам помочь.
Так что в вашем случае я бы сделал что-то вроде этого:
Реализуйте Port
таким образом, чтобы у них было DoubleProperty
для их X и Y местоположения, теперьв зависимости от того, как это должно выглядеть, реализация может отличаться, в моем случае я использовал Circle
и его centerXProperty
и centerYProperty
, другой вариант, если при использовании какой-либо прямоугольной формы нужно создать собственные centerXProperty
и centerYProperty
, они могуточень легко рассчитать, привязав к layoutX
+ (width
/ 2), то же самое для y, просто используя высоту.Это должно выглядеть примерно так:
DoubleProperty centerXProperty = new SimpleDoubleProperty(0);
centerXProperty.bind(n.layoutXProperty().add(n.widthProperty().divide(2)));
Где n
- это некоторый узел на графе сцены, вы также можете использовать prefWidthProperty
, если вы используете нестандартную ширину/ height
Ваша панель должна иметь список всех портов, теперь в зависимости от того, как вы хотите сделать это Port
с, он может отличаться, но в моем проекте я бы создал Port
наПересечение Line
, которое рисует пользователь, и Pane
, к которому он подключен, вы также можете просто поставить предопределенный Ports
на каждый Pane
и устанавливать соединение, только если конечная точка Line
находится внутри радиуса Port
.
Линия уже имеет endXProperty
и endYProperty
, поэтому вы можете просто привязать их к свойствам местоположения вашего Port
, таким образом, вы можете легко разрешить их перемещение вместе.
Если вам нужен пример кода, вам нужно предоставить то, что вы получили, чтобы я мог помочь вам с этим.
РЕДАКТИРОВАТЬ
Что касается отношения родитель-потомок, наше решение для корня диаграммы состояло в том, чтобы расширить область привязки, поскольку он дает большую часть контроля своим дочерним элементам, каждый узел в этой области привязки должен был иметь значение UmlElement
, которое далее распространяется до UmlNode
и UmlEdge
, тогда UmlNode
имеет подтипы ParentUmlNode
и ChildUmlNode
, Child
можно поместить внутрь Parent
, и их позиция связана с позицией Parent
, это не имеет значения снаружи, из-зачто когда Parent
двигается, его дети следуют за ним соответственно
ИМХО, это гораздо лучше, чем обрабатывать глубокую дочернюю позицию, основанную на корне вашего представления, поскольку могут быть некоторые проблемы с синхронизацией всего, особенно если вы добавляете изменение размера, множественный выбор и подобные более сложные функции.