2

Seesaw を使用して Clojure で GUI アプリを作成していますが、カスタム ListModel が更新されたときにリストボックス (Java の JList) を更新するのに問題があります。

これが私のコードの一部です:

(deftype ActionHistoryListModel
  [^{:unsynchronized-mutable true} listeners
   ^{:unsynchronized-mutable true} listening-to]

  ListModel
  (addListDataListener [this listener]
    (set! listeners (conj listeners listener)))
  (removeListDataListener [this listener]
    (set! listeners (remove #(= % listener) listeners)))
  (getSize [this] 
    (get-in (deref listening-to) [:count]))
  (getElementAt [this index]
    (get-in (deref listening-to) [:actions index]))

  ActionHistoryListModelProtocol
  (listen-to [this r]
    (do
      (set! listening-to r)
      (add-watch r this (fn [_ _ _ new-state] (.notify this new-state)))))
  (notify [this new-state]
    (let [action ((meta new-state) :last-action)
          const  (cond
            (= action :create) INTERVAL_ADDED
            (= action :update) CONTENTS_CHANGED)
          index  (last ((meta new-state) :action-target))
          event  (ListDataEvent. this const index index)
          notification (cond
            (= action :create) #(.intervalAdded % event)
            (= action :update) #(.contentsChanged % event))
          ]
      (. (.. System out) print (str "Index: " index "\n" "Event: " event "\n"))
      (map #(invoke-later (notification %)) listeners)))
  )

(defn make-action-history-list-model []
  (ActionHistoryListModel. #{} nil))

(def ahlm (make-action-history-list-model))
(.listen-to ahlm action-history)

(def undo-list (listbox :model ahlm))

; then put list in frame...

はどこaction-historyですかref

が発生しているため、リストを更新する必要があるポイントに移動しますSystem.out.printが、リストボックスは更新したくありません

何がうまくいかないのかについてのアイデアはありますか? EDT とウォッチ コールバックの使用を組み合わせたものですか?

さらにコードが必要な場合はお知らせください。

4

1 に答える 1

1

カスタム モデルは常に注意が必要であり、特にイベント通知に関しては注意が必要です。そのため、これがうまく機能するかどうかはわかりません。そうは言っても、なぜ何も通知されないのかについての私の最善の推測は、あなたの using mapwhich が怠惰であるということです。つまり、メソッドの最後のフォームnotifyは実際には何もしません。代わりにこれを試してください:

(doseq [listener listeners] 
  (invoke-later (notification listener)))

幸運を。

于 2012-08-22T04:07:58.347 に答える