ScalaFX:查找SubScene始终返回null

时间:2015-01-01 20:30:42

标签: scala user-interface javafx scalafx

我有一个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而不是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包装器对象,而不仅仅是获取对现有对象的引用......任何改进都值得赞赏。

1 个答案:

答案 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