Почему панели компоновки не увеличиваются в отрицательные координаты.

 
 
 
Сообщения:86
Почему панели компоновки не расширяются в отрицательные координаты.

Поведение AnchorPane:
GIF AnchorPane

Поведение Pane:
GIF Pane

Подскажите как решить данную проблему, что бы при перетаскивании контента панель компоновки правильно меняла размер во все стороны.
Изменен:20 апр 2020 21:30
 
 
Сообщения:86
Решил просто унаследоваться от Region и сделать свой макет панели которая мне нужна.
 
 
Сообщения:86
Вообщем я хотел сделать холст который бы расширялся во все стороны автоматически. Что то вроде как в САПР, только мне для других целей нужен такой функционал.
С математикой и всеми расчетами туговато, я в конц потом запутался. И в итоге начал сначала и по другому пути.
Вообщем сделал Region, в него уже помещаю Group для сетки и Group для контента. Сетку привязываю к Размерам родителя, а лэйауты контента являются якорями для перерисовки сетки. От якорей вычисляется смещение и перерисовывается сетка.
Например если смещаю контент по любому направлению на 5 пикселей то и сетку соответственно перерисовываю с учетом этого смещения. А так как область отрисовки сетки ограничена размером родителя + по 3 клетки с каждой стороны, то создается видимость перемещения. Т.е. перемещается только Group с каким то контентом в нем, а сама сетка просто рисуется в тех же рамках с новыми смещениями. Получился своего рода бесконечный холст с сеткой.

Пример с обрезкой(clip):
GIF Grid Clip

И пример без обрезки:
GIF Grid NoClip

Класс сетки как готовый элемент:
import javafx.beans.property.SimpleDoubleProperty
import javafx.geometry.Point2D
import javafx.scene.Group
import javafx.scene.layout.Region
import javafx.scene.shape.Line

class GEditorGrid : Group() {

    private val HALF_PIXEL_OFFSET = -0.5
    var spacing = 30
    private val extraSpace = spacing * 3
    private val pivotX = SimpleDoubleProperty()
    private val pivotY = SimpleDoubleProperty()
    private val viewWidth = SimpleDoubleProperty()
    private val viewHeight = SimpleDoubleProperty()

    private fun draw() {
        children.clear()
        val width = viewWidth.value
        val height = viewHeight.value
        val vLineCount = ((width + extraSpace * 2) / spacing).toInt()
        val hLineCount = ((height + extraSpace * 2) / spacing).toInt()
        val offsetPivot = Point2D((pivotX.value % spacing), (pivotY.value % spacing))
        for (i in 0 until hLineCount) {
            val hLine = Line()
            val yOffset = ((i + 1) * spacing - extraSpace) - HALF_PIXEL_OFFSET
            hLine.startX = -extraSpace.toDouble()
            hLine.endX = width + extraSpace
            hLine.startY = yOffset + offsetPivot.y
            hLine.endY = yOffset + offsetPivot.y
            children.add(hLine)
        }
        for (i in 0 until vLineCount) {
            val vLine = Line()
            val xOffset = ((i + 1) * spacing - extraSpace) - HALF_PIXEL_OFFSET
            vLine.startX = xOffset + offsetPivot.x
            vLine.endX = xOffset + offsetPivot.x
            vLine.startY = -extraSpace.toDouble()
            vLine.endY = height + extraSpace
            children.add(vLine)
        }
    }

    fun setProperty(pivot: Group, view: Region) {
        pivotX.bind(pivot.layoutXProperty())
        pivotY.bind(pivot.layoutYProperty())
        viewWidth.bind(view.prefWidthProperty())
        viewHeight.bind(view.prefHeightProperty())
        view.widthProperty().addListener { _, _, _-> draw() }
        view.heightProperty().addListener { _, _, _-> draw() }
        pivot.layoutXProperty().addListener { _, _, _-> draw() }
        pivot.layoutYProperty().addListener { _, _, _-> draw() }
    }
}
Изменен:02 мая 2020 18:47
 
 
Сообщения:86
Вообщем все это ерунда, к такой модели я масштаб не могу приделать, что бы все корректно работало нужно много расчетов, сложно очень получается, не для моего ума.

Как вариант сделать просто панель, либо Pane, либо Region с заданными размерами, которые можно менять и что бы объекты не выходили за пределы этой панели - как самый простой вариант.

Либо пробовать реализовать все все через 2d или 3d библиотеку с помощью камеры.

Если есть у кого идеи как реализовать бесконечную координатную сетку в JavaFX, как это реализовано в Редакторах графа узлов (node graph editor), предлагайте.. Хорошие варианты есть в Blender, Unity и т.п..
Изменен:09 мая 2020 11:48
 
 
Сообщения:86
Вообщем потихоньку доходят до меня все эти преобразования между родителями и детьми. Первый вариант тоже рабочий. И данную схему можно реализовать разными способами. Главное разобраться в Трансформациях и преобразованиях координат между различными узлами. Т.е. понять все вот эти методы parentToLocal, localToParent, boundsInParent, boundsInLocal и этому подобным. А также сами трансформации Scale, Rotate и другие.
Кстати мой первый вариант с сеткой только для видимой области хорош тем, что сетка постоянно перерисовывается только для небольшого участка.

Не скажу, что полностью въехал в эту тему, но хотя бы результаты есть!

Вот что получилось. Добавил точки помощи для себя, что бы видеть как что происходит. Красная точка - типа начало координат, зеленые - берут spacing из класса сетки, размер ячейки в 50 пикселей без масштаба.

Node Editor

Снимал без клипа, так что если включить clip, то за холстом(розовый прямоугольник) объекты и сетка будут обрезаться.

Ну и соответственно алгоритм сетки теперь тоже можно изменять в зависимости от масштаба. Например при увеличении делать толще основные линии и добавлять тонкие линии между основными, как это делается в других редакторах. Вот как раз этим сейчас и занимаюсь :))
Изменен:09 мая 2020 13:59
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет