【发布时间】:2012-02-07 11:34:16
【问题描述】:
上下文:我有一个基于 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))
在另一个讨论中有人指出,手动调用fireTableDataChanged 是(update-cluelist) 的主要代码异味,因为 TableModel 类之外的任何东西都不应该调用该方法。但是,我觉得这是表是从外部源动态生成的不可避免的结果。文档不是很有帮助 - 他们声明
您的自定义类只需要调用以下之一 AbstractTableModel 方法每次表数据由一个更改 外部来源。
这隐含地假定 CustomTableModel 类是数据的权威来源。
这里还有一些 clojure/java 阻抗不匹配 - 在 java 中,cluelist 和 update-cluelist 是我的 TableModel 的私有成员和方法,而在 clojure cluelist 和表模型中是update-cluelist 可以访问的动态范围变量。
我的主要问题是没有很多 clojure/swing 代码可供我寻找最佳实践。有人对最好的方法有什么建议吗?
【问题讨论】:
-
kleopatra:是的 :) 感谢您让我重新检查设计!