Я нашел понимание, что намерение связанных функций легче при печати их сначала на бумаге, чем понимание их непосредственно с экрана никогда не перестал работать, почему? Поскольку можно легко рассмотреть много строк кода на один взгляд, никакую потребность в непрерывной прокрутке.
то же самое с монитором, ориентированным в режиме портрета, можно легко понять намерение нескольких связанных функций, пересмотренных или иначе. Но не позволяйте портрету наличия экранировать быть оправданием записать функцию со многими строками.
Запись этого на stackoverflow использование портрета экранирует:-)
, я могу легко видеть много сообщений на один взгляд:-)
прокси фактически создает экземпляр tada! Вам не нужно создавать конструктор.
Да, но вместо этого рассмотрите возможность использования clojure ref. Также неприятно использовать def, подобный этому, во второй последней строке! он создает глобальную привязку для щелчка мышью, когда ваша логика основана на лексической области видимости, созданной let.
(proxy-super paintComponent g), и да, "this" доступно
Это работает для меня:
(let [click (ref nil)
panel (proxy [javax.swing.JPanel] []
(paintComponent [g]
(proxy-super paintComponent g)
(.drawImage g (.getImage
(javax.swing.ImageIcon. "play.png"))
0 0 (.getWidth this) (.getHeight this) nil)
(if @click
(.fillRect g (:x @click) (:y @click) 10 10))))]
(.addMouseListener panel
(proxy [java.awt.event.MouseAdapter] []
(mouseClicked [e]
(let [p (.getPoint e)]
(dosync (ref-set click {:x (.x p), :y (.y p)})))
(javax.swing.SwingUtilities/invokeLater #(.repaint panel)))))
(doto (javax.swing.JFrame.)
(.setContentPane panel)
(.setSize 200 200)
(.show)))