ScalaFX:始终查找 SubScene returns null
ScalaFX: looking up a SubScene always returns null
我有一个 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
而不是子场景。这是为什么?感谢任何帮助,谢谢。
编辑:
好的,我忘了井号 ('#'):
val subScene = stage.scene().lookup("#sub").asInstanceOf[SubScene]
但现在我明白了:
Exception in thread "JavaFX Application Thread"
java.lang.ClassCastException: javafx.scene.SubScene cannot be cast to
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 包装器对象,而不是仅仅获取对现有对象的引用...任何改进都值得赞赏。
只需使用
val subScene: scalafx.scene.SubSecne =
stage.scene().lookup("#sub").asInstanceOf[javafx.scene.SubScene]
不需要手动将java子场景转换成scalafx版本,因为scala有implicits。要使用 scalafx 中定义的隐含函数,您需要使用 import import scalafx.Includes._
顺便说一句,这就是 scalafx 包装器转换其属性的方式。示例 width
def width: scalafx.beans.property.ReadOnlyDoubleProperty = delegate.widthProperty
我有一个 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
而不是子场景。这是为什么?感谢任何帮助,谢谢。
编辑:
好的,我忘了井号 ('#'):
val subScene = stage.scene().lookup("#sub").asInstanceOf[SubScene]
但现在我明白了:
Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: javafx.scene.SubScene cannot be cast to 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 包装器对象,而不是仅仅获取对现有对象的引用...任何改进都值得赞赏。
只需使用
val subScene: scalafx.scene.SubSecne =
stage.scene().lookup("#sub").asInstanceOf[javafx.scene.SubScene]
不需要手动将java子场景转换成scalafx版本,因为scala有implicits。要使用 scalafx 中定义的隐含函数,您需要使用 import import scalafx.Includes._
顺便说一句,这就是 scalafx 包装器转换其属性的方式。示例 width
def width: scalafx.beans.property.ReadOnlyDoubleProperty = delegate.widthProperty