ScalaFX:始终查找 SubScene returns null

ScalaFX: looking up a SubScene always returns null

我有一个 ScalaFX 应用程序,其中包含一个带有 SceneSubScene 的舞台。 我想要实现的是在另一个范围内获取对 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