3

コンテクスト

私はこのJavaコードを持っています

    btn.setOnAction(new EventHandler<ActionEvent>() {

        public void handle(ActionEvent event) {
            System.out.println("Hello World");
        }
    });

Clojureに変換したいです。

私が知っていること

(. btn setOnAction (proxy .... ????? .... ))

質問:

ClojureでEventHandler部分を処理するにはどうすればよいですか?これはJavaテンプレートだと思います。Clojureでテンプレートオブジェクトを作成するにはどうすればよいですか?

4

2 に答える 2

6

Javaでは、これらはテンプレートではなくジェネリックと呼ばれます。さらに、それらは型消去を使用して実装されます。つまり、コンパイルされたバイトコードには一般的な情報がないため、EventHandler<Foobar>オブジェクトは一般化されていないEventHandlerインスタンスとしてコンパイルされます。

そうは言っても、Clojureはそれらをサポートしようとさえしていません。Javaコードは次のように変換されます

(.setOnAction btn 
  (proxy [EventHandler] []
    (handle [event]
      (println "Hello World"))))

構文の詳細については、Java相互運用機能proxyに関するドキュメントを参照してください。

于 2012-06-20T13:44:15.060 に答える
0

別の方法は、具象化することです。例:

(import [javax.swing JFrame JButton])
(import [java.awt.event  ActionListener])

(def f (JFrame. "Test"))
(def b (JButton. "OK"))

(.add (.getContentPane f) b)
(.addActionListener b
   (reify ActionListener
      (actionPerformed [this event]
         (println "Event is " event))
 ))
(.show f)

プロキシとreifyについては、このスレッドを参照してください
。clojureでプロキシの代わりにReifyを使用する必要があるのはなぜですか?

于 2012-06-20T15:18:13.180 に答える