2

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))ActionEventClojureExampleControllerActionEvent

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 のテキストの変更に直接バインドする方法はありますか?ボタン押し?はいと思いますが、チュートリアルではその時点に到達していません。

ありがとう!

4

1 に答える 1

1

thisハンドラーに明示的な引数が必要です。

(defn -handleSubmitButtonAction [this ^ActionEvent event]
  ...)

おそらく、これを配置するより正確な方法は、質問テキストに示されてevent いるように、ハンドラーのthis引数であり、イベントを受け入れてタイプヒントをそれに移動するために2番目の引数を追加する必要があります(おそらく最初の引数の名前をthis読みやすさのため)。

コードがまったく呼び出されるという事実を考えると、JavaFX は、ハンドラーを気にしないのであれば、イベントをまったく渡さずにハンドラーを喜んで呼び出すように思われます (それに対応する正式なパラメーターがないことからも明らかです)。 .

ActionEvent型ヒントの唯一の目的は、メソッドが on で呼び出されたときに Clojure コンパイラがリフレクション コードを発行しないようにすることeventです。これは、異なる型のオブジェクトを関数に渡すことを妨げません。

于 2013-05-19T07:17:42.110 に答える