начало / конец строки для вложенных групп / панелей javafx - PullRequest
0 голосов
/ 04 июня 2018

У меня есть какая-то визуализация с элементами, которые имеют порты, которые могут быть связаны друг с другом.Порты элемента являются дочерними элементами панели javafx, которая представляет элемент.Теперь мне было интересно, что может быть лучшим способом привязать начальную и конечную точки соединительных линий к расположению портов, поскольку порты могут располагаться довольно глубоко в иерархии элементов.Вот почему я думал, что мне могут понадобиться абсолютные позиции этих портов, но не нашел простого способа получить их.Прямо сейчас линии находятся прямо под корнем сцены между прочим.

1 Ответ

0 голосов
/ 04 июня 2018

Трудно сказать, не видя структуру вашего кода.Но у меня была похожая проблема при работе с инструментом моделирования uml, написанным на javafx, поэтому моё решение может вам помочь.

Так что в вашем случае я бы сделал что-то вроде этого:

  1. Реализуйте 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

  2. Ваша панель должна иметь список всех портов, теперь в зависимости от того, как вы хотите сделать это Port с, он может отличаться, но в моем проекте я бы создал Port наПересечение Line, которое рисует пользователь, и Pane, к которому он подключен, вы также можете просто поставить предопределенный Ports на каждый Pane и устанавливать соединение, только если конечная точка Line находится внутри радиуса Port.

  3. Линия уже имеет endXProperty и endYProperty, поэтому вы можете просто привязать их к свойствам местоположения вашего Port, таким образом, вы можете легко разрешить их перемещение вместе.

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

РЕДАКТИРОВАТЬ

Что касается отношения родитель-потомок, наше решение для корня диаграммы состояло в том, чтобы расширить область привязки, поскольку он дает большую часть контроля своим дочерним элементам, каждый узел в этой области привязки должен был иметь значение UmlElement, которое далее распространяется до UmlNode и UmlEdge, тогда UmlNode имеет подтипы ParentUmlNode и ChildUmlNode, Child можно поместить внутрь Parent, и их позиция связана с позицией Parent, это не имеет значения снаружи, из-зачто когда Parent двигается, его дети следуют за ним соответственно

ИМХО, это гораздо лучше, чем обрабатывать глубокую дочернюю позицию, основанную на корне вашего представления, поскольку могут быть некоторые проблемы с синхронизацией всего, особенно если вы добавляете изменение размера, множественный выбор и подобные более сложные функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...