2012-07-06 15 views
2

希望這只是一個愚蠢的錯誤,但我看不到它。Clojure無法找到方法JComboBox.addItemListener

; OK 
=> (filter (fn [x] (= "addItemListener" (.getName x))) (.getMethods javax.swing.JComboBox)) 
(#<Method public void javax.swing.JComboBox.addItemListener(java.awt.event.ItemListener)>) 

; Error 
=> (let [combobox (javax.swing.JComboBox. (java.util.Vector. ['a 'b 'c]))] 
     (.addItemListener combobox 
     (proxy [java.awt.event.ItemListener] [] 
      (itemStateChanged [item-event] (println (str "selection changed to " (.getSelectedItem combobox))))) 
     combobox)) 
java.lang.IllegalArgumentException: No matching method found: addItemListener for class javax.swing.JComboBox (NO_SOURCE_FILE:0) 

爲什麼不能clojure找到addItemListener方法?

+0

相同的代碼在蹺蹺板,FWIW:(讓[CB(組合框:模型[ 'A' B「C])](聽CB:選擇(FN [_]( println(str「選擇改爲」(選擇cb))))cb)。 – 2012-07-07 16:31:07

回答

3

您正在將組合框第二次傳遞給addItemListener方法,您可能想從let形式返回它。

這應該工作:

(let [combobox (javax.swing.JComboBox. (java.util.Vector. ['a 'b 'c]))] 
    (.addItemListener combobox 
        (proxy [java.awt.event.ItemListener] [] 
         (itemStateChanged [item-event] 
         (println (str "selection changed to " 
             (.getSelectedItem combobox)))))) 
    combobox) 
+0

aagh,括號錯誤,謝謝!你確定'this'參考嗎?cheatsheet中的例子(http:// clojuredocs。 org/clojure_core/clojure.core/proxy)不使用它,我發現我的代碼在沒有它的情況下工作。 – OpenSauce 2012-07-06 08:27:09

+0

文檔說明如此(http://clojure.org/java_interop#toc26)。也許我不明白它是正確的,還是已經過時了? – Daan 2012-07-06 08:29:59

+0

啊,錯過了「隱含」這個詞,它沒有傳遞給函數,它只是神奇地附加在範圍內。 – Daan 2012-07-06 08:43:22