我从Scala和ScalaFX开始,我理解大部分代码,但我不理解这段代码用于ScalaFx中的示例;
其中实例化一个匿名类,用花括号跟着它,它是如何工作的?
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
}
}
)
}
}
}
}
我不理解的部分是为什么创建一个匿名类后面是花括号(有一些更多的声明)(场景不是填充该类的抽象部分的轨迹)甚至填充或内容是函数而不是变量而黑色用于填充瞬间是val意味着这一行
fill = Black
正在调用函数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
是一个返回值的函数
答案 0 :(得分:3)
您看到的匿名类是Java的double brace initialization的Scala版本。创建对象时,将评估这些大括号内的所有内容。您可以在here(第二页左右)找到更多相关信息。
对于函数的赋值,你会看到一段Scala的语法糖,通常用于getter和setter。基本上,如果一个对象有一个定义的方法,如def fill_=(value:Color)
,那么可以使用你看到的语法调用它。 This answer稍微描述了这个功能。
因此,您正在查看的方法def fill: ObjectProperty[jfxsp.Paint] = delegate.fillProperty
实际上与您看到的任务无关,至少从语言角度来看。这是因为fill_=
方法将在类中定义。
答案 1 :(得分:0)
Scala中匿名类的语法来自Java;你也可以在这里看到它:
class Coder {
protected String name;
public Coder(String name) {this.name = name;}
}
public static void main(String[] args) {
// Prints "Mr. Noble"
new Coder("Noble") {
private String prefix = "Mr.";
{
System.out.println(prefix + " " + name);
}
}
}
因为Scala允许您在类体中编写构造函数代码,所以当您实例化这些匿名类时,将执行所有x = y
语句。正如@resueman指出的那样,这些实际上是这种格式的getter和setter:
class Scene {
var _fill
def fill_=(color: Color) // Setter, has some hidden logic to set up the UI
def fill = _fill // Getter
}
您的陈述fill = Black
已经被fill_=(Black)
贬低了。