0

Clojure 的新手。

我想分享一个对我来说似乎很奇怪的行为,但可能完全没问题。我遵循了 github https://gist.github.com/daveray/1441520#file-seesaw-repl-tutorial-clj-L381上的教程,更准确地说,是我应该向标签添加监听器的部分。让我们创建一个构造函数并显示助手:

(defn make-lb [s]
  (listbox :model (-> (symbol s) ns-publics keys sort)))
(defn display [content frame]
  (config! frame :content content)
  content)

这完美地工作:

(def lb (make-lb "clojure.core"))
(display (scrollable lb) f)
(listen lb :selection (fn [e] (println "Selection is " (selection e))))

但是,这不会:

(def lb (scrollable (make-lb "clojure.core")))
(display lb f)
(listen lb :selection (fn [e] (println "Selection is " (selection e))))

注意不同的“可滚动”位置。在第二种情况下,编译器告诉我“未知事件类型:selection seesaw.util/illegal-Argument (utils.clj:19)”

我看不出第一个片段起作用的任何原因,而第二个片段不起作用。我对 Swing 和/或其他 Java 库一无所知

4

1 回答 1

1

为什么这不起作用?(默示)

tl;博士

  • listboxscrollable返回不同的东西

细节

  • 查看不同调用的返回值(make-lb为清楚起见包括原始值):
(defn make-lb [s]
  (listbox :model (-> (symbol s) ns-publics keys sort)))

(class (make-lb "clojure.core"))
;;=> seesaw.core.proxy$javax.swing.JList$Tag$fd407141

(class (scrollable (make-lb "clojure.core")))
;;=> seesaw.core.proxy$javax.swing.JScrollPane$Tag$fd407141
  • 出于我们的目的,我们只会说listbox返回 aJListscrollable返回 aJScrollPane

  • 鉴于此,对的调用display是等价的

  • 但是,调用listen不等价

    • 在第一种情况下,lb解析为 a JList,在第二种情况下,lb解析为 aJScrollPane

更多细节

; :selection 是为每个班级专门处理的人为事件
;的小部件,所以我们破解...

  • 我称之为“真正的选择类型”的解决方案是resolve-event-aliases

    • 你会注意到有一个案例 for JList,但不是 forJScrollPane
  • 在这种JScrollPane情况下,人工:selection只是简单地从调用返回到resolve-event-aliases

    • 由于这不是“真正的选择类型”,所以事情变成梨形只是时间问题
  • 果然,get-or-install-handlers尝试查找:selection,什么也没得到,并调用(illegal-argument "Unknown event type %s" event-name)where event-nameis bound to :selection,这与您收到的异常相匹配

于 2016-09-30T05:20:50.687 回答