是JavaFX类型的ScalaFX窗格的子级吗?

时间:2015-05-27 08:54:36

标签: scala scalafx

我是Scala和ScalaFX的新手,所以我可能没有正确理解这一点。 我的问题:我将一个节点(f.e.Button)添加到ScalaFX窗格(f.e.VBox)。 当我访问窗格的子项时,子类型从ScalaFX Button更改为JavaFX Button。

当我查看ScalaFX的源代码时,我可以看到一切都是通过委托来完成的。那么ScalaFX节点丢失了吗?我认为从ScalaFX到JavaFX的隐式转换已经为我(作为新手)做了一些魔术。是否有可能以相反的方式进行隐式转换?我是否正确使用ScalaFX?

我想通过一个窗格的所有孩子。当一个孩子来自特殊类型时,我想对这个孩子进行一些操作。现在我必须检查JavaFX类型并在JavaFX节点上工作,这对我来说看起来不像是干净的代码。

欢迎提交任何内容。提前谢谢。

我附上了一个正在运行的例子。

import scalafx.Includes._
import scalafx.application.JFXApp
import scalafx.application.JFXApp.PrimaryStage
import scalafx.scene.Scene
import scalafx.scene.control.Button
import scalafx.scene.layout.VBox
import scalafx.stage.WindowEvent

object TestChildren extends JFXApp {
  stage = new PrimaryStage {
    val contentPane = new VBox()
    val b1 = new Button("B1")
    contentPane.children.add(b1)
    scene = new Scene (contentPane)

    println(b1.getClass)
    println("--")
    for (child <- contentPane.children) {
      println(child.getClass)
    }
  }
}

1 个答案:

答案 0 :(得分:0)

是的,存在隐式转换。我不知道你使用的是哪个IDE,但是例如带有Scala插件的IntelliJ 14.1表示隐式转换,这是一个非常有用的功能。

在你的情况下,

contentPane.children.add(b1)

是隐式转换发生的行。显式形式是

contentPane.children.add(Button.sfxButton2jfx(b1))

其中隐式转换是scalafx.scene.control.Button中的单行:

implicit def sfxButton2jfx(v: Button): jfxsc.Button = if (v != null) v.delegate else null