Как получить фиксированное количество изменяемых размеров ячеек без заполнения в javafx?

Задний план:

Я работаю над визуализатором для алгоритмов планирования в реальном времени. «Мир» предоставляется в текстовом файле, где «_» – свободная ячейка, а «#» – заблокированная ячейка. Ниже приведен пример:

 41
 21
 ___________________ _____________________ @
 _________________________________________
 _________________________________________
 _________________________________________
 _________________________________________
 _________________________________________
 _________________________________________
 _________________________________________
 _________________________________________
 _________________________________________
 _ _ #######################################
 _________________________________________
 _________________________________________
 _________________________________________
 _________________________________________
 _________________________________________
 _________________________________________
 _________________________________________
 _________________________________________
 _________________________________________
 ___________________ * _____________________

Очень важно, чтобы окно имело то же самое количество ячеек в каждой строке и точно такое же количество ячеек в каждом столбце.

Я должен визуализировать в Kotlin, который на 100% совместим с Java. Я решил попробовать javafx, версия 8.0.60. После некоторых исследований по макетам javafx я решил, что TilePane – лучший выбор.

Что я до сих пор:

Это то, что у меня есть до сих пор. Если вы посмотрите внимательно, вы увидите очень небольшое количество дополнений в каждом узле TilePane. Поскольку робот переходит от плитки к плитке, это небольшое количество дополнений вызывает небольшую ошибку, поскольку робот перемещается с использованием ширины и высоты плитки , не учитывая отступы. Это заставляет робота не находиться в центре плитки, когда она пересекает лабиринт.

Кроме того, мое решение сильно зависит от размера окна. Если я немного его настрою, мир будет отображаться некорректно, потому что каждая строка и столбец не имеют одинакового количества фиксированных ячеек.

Вопросов:

Эти вопросы в порядке важности.

  1. Есть ли макет или параметр, который предоставит мне фиксированное количество ячеек в строке и столбце? От этого зависит отображение мира.
  2. Как я могу избавиться от заполнения между каждым узлом в макете?
  3. Если возможно, я хотел бы изменить размер макета, сохранив первые два инварианта. Кто-нибудь знает, как это сделать?

Соответствующие части моего кода:

Примечание. Robot.fill совпадает с вызовом robot.setFill, а Kotlin опускает типы и ключевое слово new при создании объектов.

val root = TilePane(0.0, 0.0) /* The robot */ val robotWidth = TILE_WIDTH / 4.0 val robot = Rectangle(robotWidth, robotWidth) robot.fill = Color.ORANGE /* The robots starting location, needs to be drawn later */ var startX: Double? = null var startY: Double? = null for (y in 0..rowCount - 1) { val line = inputScanner.nextLine() for (x in 0..columnCount - 1) { when (line[x]) { '#' -> { val blocked = Rectangle(TILE_WIDTH, TILE_HEIGHT) blocked.fill = Color.BLACK //blocked.stroke = Color.BLACK root.children.add(blocked) } '_' -> { val free = Rectangle(TILE_WIDTH, TILE_HEIGHT) free.fill = Color.LIGHTSLATEGRAY free.opacity = .5 root.children.add(free) } '*' -> { val radius = TILE_WIDTH / 10.0 val dirtyCell = Circle(radius) //dirtyCell.stroke = Color.BLUE dirtyCell.fill = Color.BLUE root.children.add(dirtyCell) } '@' -> { startX = x * 1.0 startY = y * 1.0 root.children.add(robot) } } } }