       (.addItemListener
         (proxy [ItemListener] []
           (itemStateChanged [_] (reset! value-atom (.isSelected cb))))))))
+
+(defn update-no-faster-than [run-function interval]
+  (let [now (System/currentTimeMillis)]
+    (future
+      (Thread/sleep interval)
+      (when (> (- now @last-table-update) interval)
+        (reset! last-table-update now)
+        (run-function)))))
 
 (defn create-browser []
   (let [frame (JFrame.)

           [java.io BufferedReader File FileReader PrintWriter]
           [java.util Comparator Vector]
           [java.util.prefs Preferences]
           [java.util.concurrent LinkedBlockingQueue]
           [java.awt Color Dimension Font Insets]
           [java.awt.event ItemEvent ItemListener KeyAdapter MouseAdapter
                           WindowAdapter WindowListener]

      data
      (conj data new-row))))

(def last-table-update (atom 0))

(defn update-browser-table []
  (let [table (@browser :table)
        selected-rows (.getSelectedRows table)
