コンテキスト:私は主なUIがグリッドと手がかりの2つのタブを持つJTabbedPaneであるclojureベースのクロスワードアプリを持っています。手掛かり表は手がかりのベクトル上のビューですが、ベクトル自体はデータの正式なストアではなく、(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))
誰かがするTableModelクラス外で何が今まであってはならないので、(update-cluelist)
は手動、fireTableDataChanged
を呼び出すされることが主要なコードのにおいであることに注意そのメソッドを呼び出す。しかし、私はこれがテーブルが外部ソースから動的に生成されることは避けられない結果であると感じています。ドキュメントはあまりにも便利ではありません - 。彼らは
カスタムクラスは、単に各時刻表データは 外部ソースによって変更された1次 AbstractTableModelにメソッドを呼び出す必要があると述べています
これは、CustomTableModelクラスがデータの信頼できるソースであることを暗黙的に前提としています。
もここのClojure/Javaのインピーダンス不整合のビットがあります - Clojureのcluelist
とテーブルモデルで動的にそのVARSをスコープしているのに対し、Javaで私は、cluelist
とupdate-cluelist
は私のTableModelのプライベートメンバとメソッドも持っているだろうupdate-cluelist
にアクセスしています。
私の主な問題は、私がベストプラクティスを探すためにたくさんのクロージャー/スイングコードがないことです。これを行うための最善の方法については誰にもアドバイスがありますか?
_someone_は私です:-) – kleopatra
kleopatra:yep :)デザインを再検査してくれてありがとう! –