2010年8月24日火曜日

[JavaFX] Button.action

これは単なる疑問。
Button クラスに action という変数(APIリファレンスとしては変数、という呼び方が正しいと思うが属性、でもよいような)があるのだが、これにはfunction (): Voidが必要なんだな。
だからまぁ、こう書く。

var b = Button {
  layoutX: 10.0
  layoutY: 10.0
  text: "ボタン"
  action: function () {
    // 処理記述
  }
}
これでも良いんだけど、こう書きたくなってしまう。

var b = Button {
  layoutX: 10.0
  layoutY: 10.0
  text: "ボタン"
  action: buttonAction()
}

function buttonAction () {
  //処理記述
}
これがダメなんですよー。actionはfunction()でないとだめ。だからVoid返すfunctionじゃダメで、こう書くことで回避できる。

var b = Button {
  layoutX: 10.0
  layoutY: 10.0
  text: "ボタン"
  action: buttonAction()
}

function buttonAction (): function(): Void {
  function () {
  //処理記述
}
}
なんじゃこりゃと。2行にfunctionが3つも出てきてホントやめて欲しいのでこうする。

var b = Button {
  layoutX: 10.0
  layoutY: 10.0
  text: "ボタン"
  action: function(){
    buttonAction()
  }
}

function buttonAction (): Void {
  //処理記述
}
何がなにやら。

以下、さくらばさん、bluepapa32さんからいただいたコメントにより加筆。
ありがとうございます!

結局、この例ではこうするのが一番良い。


var b = Button {
  layoutX: 10.0
  layoutY: 10.0
  text: "ボタン"
  action: buttonAction // <- 括弧無し
}

function buttonAction (): Void {
  //処理記述
}

関数を変数として扱うことが出来る反面、
括弧を付けてしまうと関数の結果だけが代入されてしまう。
action属性はfunction(): Voidという関数型の変数を割り当てる必要があるため、
こういう結果になるというわけ。

そうすると、引数付きの関数を呼びたい場合は
やはり一枚かませる必要がありそう。

さくらばさん (Java in the Box annex)
bluepapa32さんのブログ

2 件のコメント:

Yuichi Sakuraba さんのコメント...

これは単純なことで、カッコが多いんです。
だから、2番目の書き方では
action: buttonAction
と書きます。
buttonActionの後にカッコを書いてしまうと、関数コールが発生してしまうためうまくいかないのです。カッコを書かなければ、関数型の変数とみなされるので OK です。

hanizo さんのコメント...

ありがとうございます!
加筆しましたー。