Swing 图像处理、扩展JPanel和模拟Clojure中的类

Swing 图像处理、扩展JPanel和模拟Clojure中的类,swing,lisp,clojure,Swing,Lisp,Clojure,那里!我正在swing/clojure中构建一个图像处理应用程序,现在我需要开发一个图像面板,在其中我可以单击并计算数据。多亏了,我现在对如何在Java中实现这一点有了一个很好的想法,但在它与Clojure的集成方面我仍然没有太多问题 让我们看看库伯德是怎么建议我的。首先,我们应该用Java扩展一个类。在clojure中,我们使用proxy宏来执行此操作,因此我们有如下内容: (def painting-panel (proxy [JPanel] [])) 建议和代码更正也欢迎 谢谢大家!

那里!我正在swing/clojure中构建一个图像处理应用程序,现在我需要开发一个图像面板,在其中我可以单击并计算数据。多亏了,我现在对如何在Java中实现这一点有了一个很好的想法,但在它与Clojure的集成方面我仍然没有太多问题

让我们看看库伯德是怎么建议我的。首先,我们应该用Java扩展一个类。在clojure中,我们使用
proxy
宏来执行此操作,因此我们有如下内容:

(def painting-panel (proxy [JPanel] [])) 建议和代码更正也欢迎

谢谢大家!

  • 代理实际上创建了一个实例tada!您不需要创建构造函数

  • 是的,但请考虑使用CuljuleRef。同样,在最后一行的第二行使用def也是令人讨厌的!当您的逻辑依赖于let创建的词汇范围的绑定时,它会为点击点创建一个全局绑定

  • (代理超级油漆组件g),并且是“此”可用

  • 这对我很有用:

    (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)))
    
    (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)))