※これはAdvent Calendar向けのエントリではありません

さくらばさんのいろふさん絵描き歌 by JavaFXを、ScalaFXにしてみただけです。
ていうか、ゆきーんさんのエントリを見て、「おー、じゃあScalaFXで書いてみたら23日のエントリに使えっかな~」と思っていたら、意外な方面からJavaFXで先を越されたというか潰されたというか。
JavaとScalaで違うといったって、結局JavaFXだからねぇ。これではネタ被りとみなされそうなので23日は何か考えないと。
とはいえせっかくなのでやってみるだけやってみた。

基本的にさくらばさんと同じですが、FXMLを使わずにプログラムだけでやる場合、やはりScalaFXはかなり見やすくなっていると思います。

こんな感じ。

import scalafx.stage.Stage
import scalafx.stage.Stage._
import scalafx.scene._
import scalafx.scene.input._
import scalafx.scene.shape._
import scalafx.scene.paint._
import scalafx.scene.shape._
import scalafx.Includes._
import javafx.application.Application

object IrofShape{
  def main(args : Array[String]) = Application.launch(classOf[IrofShape])
}
class IrofShape extends Application {
  def start(stage: javafx.stage.Stage): Unit = {
    val irof = new Group{
      children = Seq(
        //枠
        new Rectangle{
          strokeWidth = 5
          stroke = Color.BLACK
          fill = Color.WHITE
          translateX = 0
          translateY = 0
          width = 300
          height = 300
        },
        //輪郭
        new Path{
          strokeWidth = 10
          stroke = Color.BLACK
          fill.value = null
          elements = Seq(
            MoveTo(126.5, 267),
            ArcTo(117, 117, 0, 146, 184.5, true, false),
            LineTo(210, 255),
            new ClosePath
          )
          clip = Rectangle(0, 0, 300, 300)
        },
        //ふき出し
        new Path{
          strokeWidth = 10
          stroke = Color.BLACK
          fill = Color.WHITE
          elements = Seq(
            MoveTo(50, 30),
            LineTo(153, 30),
            ArcTo(30, 30, 0, 153, 90, false, true),
            LineTo(105, 90),
            CubicCurveTo(105, 90, 90, 105, 129, 142),
            CubicCurveTo(90, 135, 66, 120, 81, 90),
            LineTo(57, 90),
            ArcTo(30, 30, 0, 50, 30, false, true)
          )
        },
        //目
        new Circle{
          centerX = 255
          centerY = 204
          radius = 15
          fill = Color.WHITE
          stroke = Color.BLACK
          strokeWidth = 10
        }
      //ふき出しの中の点
      ) ++ (for(x <- Seq(51, 84, 120, 154))yield Circle(x, 60, 5, Color.BLACK))
    }
    new Stage(stage){
      title = "irof shape by ScalaFX"
      scene = new Scene(irof, 300, 300)
    }.show
  }
}

Pathとかはだいぶ見やすいけど、CubicCurveToあたりは引数が多くてどれがどのプロパティだかわからなくなりがちなのがちょっと大変ですかね。
強いて言えば、ふき出しの中の点がfor式で書ける辺りがScalaっぽいといえばScalaっぽいかな。 (そのせいで絵描き歌としては順番かわっちゃってるけども)

irof_scalafx