我的ScalaFX 8应用程序的主要布局包含BorderPane
。 top
属性包含一个菜单,而bottom
包含类似于状态栏的内容。我的目标是显示一个组件,用于在BorderPane的center
中查看3D对象(充当SubScene
)。
stage = new PrimaryStage {
scene = new Scene(900, 900, true, SceneAntialiasing.Balanced) {
root = new BorderPane {
top = createMenu // creates a menu inside of a VBox
center = createViewer // should create a subscene inside of whatever is needed
bottom = createStatusBar // creates a status bar inside of a VBox
}
}
}
我正在尝试使用SubScene创建一个最小的工作示例,该示例仅包含黑色背景和简单的球体,不多也不少。 SubScene应该使用BorderPane中心可用的整个空间并相应地调整大小。不幸的是,我无法使其发挥作用。
由于SubScene的大小是固定的,我认为有必要将SubScene嵌入另一个容器(能够自动调整大小)并将SubScene的尺寸绑定到它周围的容器的尺寸。
def createViewer = {
val bp = new BorderPane
val subScene: SubScene = new SubScene(bp, 200, 200, true, SceneAntialiasing.Balanced) {
fill = Color.Black
width <== bp.width
height <== bp.height
content = new Sphere(3) { material = new PhongMaterial(Color.Red) }
camera = new PerspectiveCamera(true) { ... }
}
bp.center = subScene
subScene
}
结果如下:
两个明显的问题:
我的假设是我在理解SubScene的根元素是什么以及它的作用方面存在一些问题。我发现another thread for JavaFX with a similar problem,这个解决方案区分了SubScene的根元素(我不确定该元素来自哪里)和Pane,但我不能将它应用于我的情况。任何帮助表示赞赏。感谢。
答案 0 :(得分:0)
这里的想法是获取顶级场景的只读属性,这可能是一种更优雅的方式来做到这一点,但这是有效的
scene = new Scene(900, 900, true, SceneAntialiasing.Balanced) {
// these are read only properties for the scene
var tmpw = this. width
var tmph = this. height
root = new BorderPane {
top = new HBox {
content = new Label {
text = "menu"
}
}
center = createView(tmpw, tmph)
}
}
width onChange show
height onChange show
}
这里的想法是将只读属性绑定到子场景的属性,然后 subcene将重新调整大小,可能有一种方法可以避免'this'关键字。 我已经测试了这个以及子场景与父场景一起重新调整大小。我已经省略了PerspectiveCamera代码块,因为你没有包含你正在使用的东西
def createView(boundWidth : ReadOnlyDoubleProperty, boundHeight : ReadOnlyDoubleProperty): BorderPane = {
new BorderPane {
center = new SubScene(boundWidth.get(), boundHeight.get(), true, SceneAntialiasing.Balanced) {
fill = Color.BLACK
content = new Sphere(3) { material = new PhongMaterial(Color.RED) }
camera = new PerspectiveCamera(true)
// bind the subscene properties to the parents
this.width.bind(boundWidth.add(-200))
this.height.bind(boundHeight.add(-200))
}
}
}