我有一个 ScalaFX 应用程序,其中包含一个带有 aScene
和SubScene
. 我想要实现的只是在另一个范围内获得对 SubScene 的引用(准确地说是一种方法),以便稍后更改 SubScene 的内容。我的最小工作示例(不起作用......)如下所示:
object GuiTest extends JFXApp {
def onClickByUser = {
val subScene = stage.scene().lookup("sub").asInstanceOf[SubScene]
println(subScene) // always null
}
stage = new PrimaryStage {
scene = new Scene(900, 900, true, SceneAntialiasing.Balanced) {
root = new BorderPane {
center = createView
}
}
}
def createView = {
new BorderPane {
center = new SubScene(800, 800, true, SceneAntialiasing.Balanced) {
id = "sub"
}
}
}
}
在这个简单的例子中,我添加了onClickByUser
当用户单击按钮时执行的方法(为简单起见,上面未显示按钮定义) - 但我总是得到null
而不是 SubScene。这是为什么?任何帮助表示赞赏,谢谢。
编辑:
好的,我忘记了井号('#'):
val subScene = stage.scene().lookup("#sub").asInstanceOf[SubScene]
但现在我得到了这个:
线程“JavaFX 应用程序线程”中的异常 java.lang.ClassCastException:javafx.scene.SubScene 无法转换为 scalafx.scene.SubScene
如果我省略asInstanceOf[SubScene]
,那么它可以工作,但是返回的值当然具有类型Node
而不是SubScene
.
编辑2: 它的工作原理是这样的:
val javaSubScene = stage.scene().lookup("#sub").asInstanceOf[javafx.scene.SubScene]
val subScene = new SubScene(javaSubScene)
但这在我看来有点难看,必须使用 java 类并创建新的 scala 包装器对象,而不仅仅是获取对现有对象的引用......任何改进都值得赞赏。