1

我有一个 ScalaFX 应用程序,其中包含一个带有 aSceneSubScene. 我想要实现的只是在另一个范围内获得对 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 包装器对象,而不仅仅是获取对现有对象的引用......任何改进都值得赞赏。

4

1 回答 1

1

只需使用

 val subScene: scalafx.scene.SubSecne = 
             stage.scene().lookup("#sub").asInstanceOf[javafx.scene.SubScene]

您不需要手动将 java 子场景转换为 scalafx 版本,因为 scala 具有implicits。要使用 scalafx 中定义的隐式,需要使用 importimport scalafx.Includes._

顺便说一句,这就是 scalafx 包装器如何转换它们的属性。例子width

def width: scalafx.beans.property.ReadOnlyDoubleProperty = delegate.widthProperty
于 2015-05-06T02:24:40.417 回答