3

我从 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

            }
          }
        )

      }

    }

  }

}

我不明白的部分是为什么在创建匿名类时要跟着花括号(还有更多声明)(场景不是填充该类的抽象部分的线索),甚至填充或内容都是函数不是变量,Black for fill for instant 是 val 意味着这条线

fill = Black

正在调用一个函数填充并为其分配一个 val(对我来说没有意义),这是填充定义

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 来更新值?

委托.fillProperty

是一个返回值的函数

4

1 回答 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)

于 2015-03-05T21:34:28.180 回答