我有一个ScalaFX应用,其中包含一个Scene
和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
。
EDIT2: 它的工作原理如下:
val javaSubScene = stage.scene().lookup("#sub").asInstanceOf[javafx.scene.SubScene]
val subScene = new SubScene(javaSubScene)
但是在我看来这有点难看,不得不使用java类并创建新的scala包装器对象,而不仅仅是获取对现有对象的引用......任何改进都值得赞赏。
答案 0 :(得分:1)
只需使用
val subScene: scalafx.scene.SubSecne =
stage.scene().lookup("#sub").asInstanceOf[javafx.scene.SubScene]
您不需要手动将java子场景转换为scalafx版本,因为scala具有implicits。要使用scalafx中定义的含义,您需要使用导入import scalafx.Includes._
BTW这就是scalafx包装器转换其属性的方式。示例width
def width: scalafx.beans.property.ReadOnlyDoubleProperty = delegate.widthProperty