run関数って何ですか

run関数とは

run関数は.fxスクリプトファイルを実行したときに、自動的に呼び出されるスクリプト関数です。 インスタンス関数ではありません。 run関数は.fxファイルに一回だけ宣言できます。 Javaのpublic static void main(String args[])に相当します。

run関数を他のスクリプトから呼び出すこを想定しているなら、 適切なアクセス識別子(publicなど)を設定してください。

run関数の引数には、実行時のコマンドライン引数が渡されます。引数が不要なら省略できます。 標準実行とWeb Start実行では引数が渡って来ますが、 ブラウザ実行(アプレット)とモバイル実行では渡って来ません。 他の方法で引数を取得する必要があります。別のTipsで説明しています。

戻り値の型の指定(Void)は省略できます。

例:

public function run(args:String[]):Void {
  println("args = {args.toString()}");
}

実行結果:

args = [ one, two, three ]

引数と戻り値の型の両方を省略した例:

function run() {
}

run関数とStageの共存

スクリプトレベルでStageをインスタンス化(オブジェクトリテラルを宣言)すると、 ウインドウが開きます。 また、run関数の中でStageをインスタンス化しても同様です。 では、スクリプトレベルでStageをインスタンス化しつつ、何らかの初期処理を run関数にやらせることはできるでしょうか。

例1:

var title:String;

function run(args:String[]):Void{
  title = arges.toString();
}

Stage {
  title : bind title
  scene: Scene {
    width: 200
    height: 200
    content: [  ]
  }
}

これはエラーになります。コンパイルできません。Stageを変数に保存してください。 コマンドライン引数を取る例なので標準の実行か、あるいはWeb Start実行をしてください。

例2:

var title:String;

function run(args:String[]):Void{
  title = arges.toString();
}

def stage = Stage {
  title : bind title
  scene: Scene {
    width: 200
    height: 200
    content: [  ]
  }
}

bindさせてやることで目的は達成されます。このbindをしないと値が反映されません。 つまりrun関数がスクリプト変数stageの初期化よりも先という保証は無いようです。

次はrun関数の中でStageをインスタンス化します。

例3:

function run(args:String[]):Void{
  Stage{
    title:args.toString();
    scene: Scene {
      width: 200
      height: 200
      content: [  ]
    }
  }
}

これも問題ありません。最初に(勝手に)動くのがrun関数だけで、そのブロック内を 順番に処理が進むのでわかりやすく確実です。bindは不要です。

カスタムノードで活躍するrun関数

私がよくやるのは前述の「例3」です。カスタムノードを作ったとき、必ずrun関数で Stageを作って、scene.contentにそのカスタムノードを食わせます。 そうすることで、ビルドすること無しにNetBeans IDEのJavaFXプレビューに、 カスタムノードが出現します。 このおかげで見栄えを整える作業がとても楽です。 .fxを更新するたびにJavaFXプレビューで確認できるのですから。

また、そのStageにアニメーションを起動するボタンや、属性を変化させるコントロールを配置すれば、 カスタムノードを単体で起動(右クリックでRun File)することで、 単体テストが行えます。

図:LevelMeterカスタムノードのrunから起動されたStage

自作のカスタムノードがアプリケーション本体から 呼び出されるのは、オブジェクトリテラルによるインスタンスであって、 スクリプトレベルのrun関数が呼び出されるわけではありません。 (また、そうしてはいけません。) 従って、run関数をそのまま残しておいて問題ありませんし、 保守を考えれば是非残すべきでしょう。


カウンター

Home