我开始学习Scala和ScalaFX,我理解大部分代码,但我不理解在ScalaFx示例中使用的这段代码;
在其中实例化一个匿名类,然后跟随花括号,这是如何工作的?
执行调用 fill 函数并将一个值分配给它(对我来说没有意义),这是 fill 的定义。
在其中实例化一个匿名类,然后跟随花括号,这是如何工作的?
object ScalaFXHelloWorld extends JFXApp {
stage = new PrimaryStage {
title = "ScalaFX Hello World"
scene = new Scene {
fill = Black
content = new HBox {
padding = Insets(20)
children = Seq(
new Text {
text = "Hello"
style = "-fx-font-size: 48pt"
fill = new LinearGradient(
endX = 0,
stops = Stops(PaleGreen, SeaGreen)
)
},
new Text {
text = "World!!!"
style = "-fx-font-size: 48pt"
fill = new LinearGradient(
endX = 0,
stops = Stops(Cyan, DodgerBlue)
)
effect = new DropShadow {
color = DodgerBlue
radius = 25
spread = 0.25
}
}
)
}
}
}
}
我不理解的部分是为什么创建匿名类后面要跟着花括号(里面有更多声明)。其中 Scene 不是填充该类抽象部分的轨迹,fill 或 content 也不是变量而是函数。例如,Black for fill 是 val 类型,这意味着该行代码
fill = Black
执行调用 fill 函数并将一个值分配给它(对我来说没有意义),这是 fill 的定义。
def fill: ObjectProperty[jfxsp.Paint] = delegate.fillProperty
这是黑色字体
val Black = new Color(jfxsp.Color.BLACK)
请帮忙解释一下使用花括号实例化新对象的工作原理,我想要理解。
这是因为ScalaFx正在包装JavaFx,这里发生了一些特殊的事情吗?
谢谢大家。
更新:
现在我知道它通过语法糖调用了一个setter,但我检查了那个setter,不明白里面发生了什么。
看看这个:
def fill: ObjectProperty[jfxsp.Paint] = delegate.fillProperty
def fill_=(v: Paint) {
fill() = v
}
为什么setter调用getter来更新值?
delegate.fillProperty是一个返回值的函数。