Hatena::ブログ(Diary)

IT-Walker on hatena このページをアンテナに追加 RSSフィード

2007-07-12 Undocumented JavaFX Script

Undocumented JavaFX Script

さっきから、ずいぶん久しぶりにJavaFX Scriptを触っています。

サンプル漁って、ソースコード読んで、知らないうちに自分がずいぶん遅れをとっていたことに気づき、反省。気付かせていただいたさくらばさんに感謝、感謝。

wakhokナイトセミナーまでの期間(明日までやんけ(^^; )、心を入れ替えてJavaFXに精進いたします。

で、JavaFXが発表された直後に、ドキュメントに大体目を通しておいたのですっかり油断していた言語仕様などについても、知らない事がいっぱいあるのが判明。

世のえらい人たちはもはや使いこなしておられるようなのですが、まとまった情報が見当たらなかったのでまとめてみました。

アンドキュメントな文法1: クラス宣言文中に出てくる「...」

こんなやつです。

class AbstractPerson {
  operation talk();
  ...     // ← コレ
}

今日謎が解けました…解けてみると簡単、これは単なる「抽象クラス」指定でした。以下のような特徴を持ってました。

  • どうやらクラス宣言文の一番最後に書かなければならないらしい
  • この指定があるとnewできなくなる
  • 抽象クラスを継承したサブクラスは、親クラスの本体を定義されていないメソッドを実装する必要がある
  • ちなみにこの宣言なしだと、本体を持たないメソッドを含むクラスも、普通にnewできる。おまけにメソッド(functionやoperation)の呼び出しまでできる(ただし、何も起きない)

アンドキュメントな文法2:「import as」

これも、JavaFXフレームワーク内ではよく出てきます。使い方は簡単。

「import FQCN as 別名」とやると、インポートしたクラスに別名をつけることができます。

フレームワーク内では、以下のようにjava.awtのクラスに別名をつけることが多いようです。かぶるもんね。


import java.awt.Color as AWTColor;

アンドキュメントな文法3:「durオペレータ」

超重要演算子、なのにアンドキュメント。

とはいえ知らなかった自分が恥ずかしぃです。。みなさんごめんなさい。

岡崎さん桜庭さんブログを参考にしながら勉強しました。

durキーワードの目的は、時間的に間隔を置いて処理を繰り返すことです。

「100ミリ秒ごとに、画面の透明度を10%ずつ下げてフェードインエフェクト」といった、アニメーション関連の処理を行うときに重宝します。

dur関連の文法は複雑で、今の僕にはきちんと系統だった説明を行えないのですが、どうやら以下のようなパターンがあるようです。


// 一定間隔おきに値をゲットする。
// 以下の例では1000ミリ秒の間に、配列要素内の値(1〜10)を一定間隔おきに返す。
var i = [1..10] dur 1000;

// 一定間隔おきに値をゲットする その2
// unitintervalはキーワードで、durが返す値の単位(?)。
// この例では、1000ミリ秒の間、秒5回のペースで値が帰る。
// 値は、開始してからの秒数。
i = unitinterval in dur 1000 fps 5;

// ループ内での使用。
// この例では、2000ミリ秒の間、秒5回のペースでループ本体を
// 実行する。開始してからの秒数がunitに格納される
// 「dur -1」とやると、無限ループ。unitは常に0になる(さくらばさん情報)
for (unitinterval unit in dur 2000 fps 5) {
  System.out.println(unit);
}

// ループ内での使用その2。
// 配列内の値をiに代入しながら、1000ミリ秒の間一定間隔おきに
// ループ内の処理を実行する
// 変な文法。
for (i in [0..100]) (dur 1000 fps 10) {
   System.out.println(i);
}

パターンとしてはこんなところだと思います。

また、durキーワードの後に続く文法要素は、多くが省略可能ですが、完全に指定すると以下のような感じです。(「[]」で囲んだ部分は省略可能)

dur 継続期間(ミリ秒) [イージング指定] [fps 秒あたりのフレーム数] [while 継続条件] [continue if 繰り返し条件]

イージング指定は、linear、easein、easeout、easebothを指定できます。

linearは厳密に一定間隔となります。

easeinは最初ゆっくり、後から加速。

easeoutは最後ゆっくり。easebothは最初と最後がゆっくりになります。

省略時はeasebothです。


fpsは省略可能(省略した場合は、、よくわかりません)で、frame per second(1秒あたりのフレーム数)のこと。


whileのあとの継続条件は、この条件を満たさない場合繰り返しが終了します。


continue ifの後は、その条件を満たす限り、何度もdur自体が繰り返されます。「continue if true」として無限にアニメーションさせることがよくあります。


durを理解するのに使ったサンプルが以下(しょぼしょぼですが)。もしお役に立てば幸いです。

ウィンドウ内にdurからの戻り値を繰り返し表示します。

「continue if true」にしたり、「while true」にしたり、いろいろ遊んでみるとよいと思います。

import javafx.ui.*;

var count = 0;
Frame {
    var: frame
    content: Label {
        text: bind ([1..100] dur 1000 easein fps 5 while frame.visible continue if (++count < 3)).toString()
    }
    visible: true
    centerOnScreen: true
}

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

トラックバック - http://d.hatena.ne.jp/Syunpei/20070712/1184219120