上下文:我有一個基於clojure的填字遊戲應用程序,其主UI是具有兩個選項卡,網格和線索表的JTabbedPane。線索表是一個包含線索向量的視圖,但向量本身不是數據的權威存儲區,而是通過一個(active-cluelist)
函數從一些內部數據結構動態生成,由線索選項卡觸發。這個擺臺模型代碼設計不好嗎?
所以這就是線索表的實現:
(def cluelist [])
(def update-cluelist)
(def model)
(defn make []
(let [column-names ["Sq" "Word" "Clue"]
column-widths [48 200 600]
table-model (proxy [AbstractTableModel] []
(getColumnCount [] (count column-names))
(getRowCount [] (count cluelist))
(isCellEditable [row col] (= col 2))
(getColumnName [col] (nth column-names col))
(getValueAt [row col] (get-in cluelist [row col]))
(setValueAt [s row col]
(let [word (get-in cluelist [row 1])]
(add-clue word s) ; editing a cell updates the main clue data
(def cluelist (assoc-in cluelist [row 2] s))
(. this fireTableCellUpdated row col))))
table (JTable. table-model)
]
; some pure display stuff elided
(def model table-model)
)
(defn update-cluelist []
(def cluelist (active-cluelist))
(.fireTableDataChanged model))
有人在另一個討論中指出,它是(update-cluelist)
手動調用fireTableDataChanged
主代碼異味,因爲沒有爲TableModel類之外應該永遠是調用該方法。但是,我覺得這是表格從外部動態生成的不可避免的後果。該文檔是不是太有幫助 - 他們指出
您的自定義類只需要通過一個 外部源來調用一個下列 AbstractTableModel的方法每次表數據被改變。
它隱含地假定CustomTableModel類是數據的權威來源。
還出現了一個有點Clojure的/ java的阻抗不匹配的位置 - 在Java中我會用Clojure cluelist
和臺式有cluelist
和update-cluelist
是我的TableModel的私有成員和方法,而動態範圍的瓦爾那update-cluelist
可以訪問。
我的主要問題是沒有太多的clojure/swing代碼,我可以尋找最佳實踐。有沒有人有任何建議,以最好的方式來做到這一點?
_someone_ being me :-) – kleopatra 2012-02-07 12:32:20
kleopatra:是的:)謝謝讓我重新審視設計! – 2012-02-07 23:28:56