列表框 (JList) 不会从自定义列表模型动态更新



我正在Clojure中使用Seesaw开发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...

其中CCD_ 1是CCD_。

由于System.out.print正在发生,但列表框不想更新,因此列表应该更新

有什么可能出错的想法吗?是不是混合使用EDT和手表回调?

如果需要更多的代码,请告诉我。

自定义模型总是很棘手,尤其是在事件通知方面,所以很难说它的效果如何。也就是说,我对为什么没有收到任何通知的最佳猜测是,您使用的map是懒惰的,即notify方法中的最后一个表单实际上没有任何作用。试试这个:

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

祝你好运。

相关内容

  • 没有找到相关文章

最新更新