如何在javafx中获得固定数量的没有填充的调整大小的单元格?

背景:

我正在研究实时规划算法的可视化工具。 “世界”是在一个文本文件中提供的,其中'_'是一个空闲单元格,'#'是一个被阻止的单元格。 以下是一个例子:

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

窗口在每一行中具有完全相同数量的单元格,并且在每一列中具有完全相同数量的单元格是非常重要的。

我必须在Kotlin中可视化,这是与Java 100%互操作的。 我决定尝试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) } } } }