         (one-by-one lns (fn [r] 
                           (one-by-one (range (count (cells r)))
                             (fn [c]
-                              (.setValueAt control 
-                                ((cells r) c)
+                              (!!!! obj :set-cell-value
                                 (+ starty r)
-                                (+ startx c))))))))))
+                                (+ startx c)
+                                ((cells r) c))))))))))
 
 (defn-swing-threads* table-to-clipboard!
   "Takes a table widget as parameter and copies the current

         :widget   pane
         :control  table
         :model    model
  
         :register-keyboard-action
         (fn-swing-threads*-doc "Registers a keyboard action on the table.

  "Takes a java-array and turns it into a list"
  [array]
  (map (rho aget array) (range (alength array))))

(defmacro !!
  "Takes a map, a key and arbitrary additional parameters and calls
   the function that is the value of the map under the key with
   the given additional parameters"
  [map key & parameters]
  `((~map ~key) ~@parameters))

(defmacro !!!
  "Takes a map, a key and arbitrary additional parameters and calls
   the function that is the value of that map, which is the map under
   the key :handler, under the key with the given additional parameters"
  [map key & parameters]
  `(((~map :handler) ~key) ~@parameters))

(defmacro !!!!
  "Takes a widget, a key and arbitrary additional parameters and calls
   the handler function of the widget that is associated with the key
   with the widget as first parameter and the given additional parameters"
  [map key & parameters]
  `(((~map :handler) ~key) ~map ~@parameters))


;;;
;;; java & swing utils
