JavaFX チュートリアル ( http://docs.oracle.com/javafx/2/get_started/fxml_tutorial.htm ) に従って、 Clojure で実行しようとしています。lein run
今のところ、セットアップ:aot :all
などを行ってからやっているだけです(:gen-class)
。 理解するのに数日かかりましたが、今ではほとんど機能しているようです。
でsrc/jfxtwo/ClojureExampleController.clj
:
(defn -handleSubmitButtonAction [^ActionEvent event]
(let [actiontarget (Text.)]
(println "event button pressed")
(println "Event instance:" event)
(println "Event class:" (class event))
(.setText actiontarget "Sign in button pressed...")))
でresources/fxml_example.fxml
:
<GridPane fx:controller= "jfxtwo.ClojureExampleController"
xmlns:fx= "http://javafx.com/fxml"
alignment= "center" hgap= "10" vgap= "10"
styleClass= "root" >
...
<Button text= "Sign In"
onAction= "#handleSubmitButtonAction" />
...
<Text fx:id= "actiontarget"
GridPane.columnIndex= "1" GridPane.rowIndex= "6" />
...
fxml および css ファイルを読み取って適切な GUI を生成できる clojure コードがあります。Text
ボタンを押すと、イベント ハンドラーが呼び出されていることがわかりますが、変更したい、またはActionEvent
ボタンの押下に関連付けられているインスタンスにアクセスする方法がわかりません。私はインスタンスについて何かを見よう(println event)
としましたが、これは何らかの理由でコールバック関数がイベントが であると考えていることを示しているだけです。(println (class event))
ActionEvent
ClojureExampleController
ActionEvent
event button pressed
Event instance: #<ClojureExampleController jfxtwo.ClojureExampleController@3e61061d>
Event class: jfxtwo.ClojureExampleController
これを行う Java コードは次のようになります。
public class JFXAppSampleController {
@FXML private Text actiontarget;
@FXML protected void handleSubmitButtonAction(ActionEvent event) {
actiontarget.setText("Sign in button pressed");
}
}
Clearle@FXML
注釈がここで魔法を行っています。何が起こっているのですか? Clojure でこれを機能させるにはどうすればよいですか?
また、ボタンの押下を FXML のテキストの変更に直接バインドする方法はありますか?ボタン押し?はいと思いますが、チュートリアルではその時点に到達していません。
ありがとう!