我正在尝试使用 ScalaFX 绘制树形图 - 它们之间带有箭头的节点。
为了简化布局,我使用标准 ScalaFX 布局容器(例如 HBoxes 和 VBoxes)嵌套每个分支。
我想不出画线的好方法,特别是将线的开始和结束属性绑定到它们连接的节点的属性。如果它们在同一个容器中,那就很容易了,我可以做类似的事情
startX <== start.centerX
但是,如果它们在不同的容器中,它就不起作用 - 我需要找到与场景相关的组件。
附上最小的例子 - 真的,我正在寻找一些东西来用有效的东西替换 Arrow 中的绑定。我想——如果可能的话——保持干净整洁的 ScalaFX 听众做事风格。
编辑:当前的行为是从顶部节点向左绘制一条水平线 - 坐标没有被转换以匹配它们所在容器的场景坐标,我不知道该怎么做。
package com.moseph.artifacts.visualisation
import scalafx.Includes._
import scalafx.scene.layout._
import scalafx.application.JFXApp
import scalafx.scene.Scene
import scalafx.scene.shape.Circle
import scalafx.scene.shape.Line
import javafx.geometry.Insets
object TestVisualiser extends JFXApp { self =>
val nodes = new Nodes
stage = new JFXApp.PrimaryStage {
title = "Test Visualiser"; width = 500; height = 1000
scene = new Scene {
root = new StackPane {
content = Seq( nodes , new Pane {
content = Seq( new Arrow( nodes.a.circ, nodes.b.circ ), new Arrow( nodes.a.circ, nodes.b.circ ))
} )
}
}
}
}
class Nodes extends VBox { nodes =>
minWidth = 100
val a = new TNode
val b = new TNode
val c = new TNode
val d = new TNode
content = Seq( a, new HBox{ content = Seq( b, c, d) } )
}
class TNode extends Pane { node =>
val circ = new Circle { radius = 10; centerX <== node.width/2; centerY = 5}
content = circ
padding = new Insets(50)
}
class Arrow(from:Circle,to:Circle) extends Line {
startX <== from.centerX + from.translateY + from.layoutY
startY <== from.centerY + from.translateY + from.layoutY
endX <== to.centerX + to.translateX + to.layoutX
endY <== to.centerY + to.translateY + to.layoutY
}