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

标签 swing lisp clojure

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

让我们看看 coobird 建议我怎么做。首先,我们应该在 Java 中扩展一个类。在 clojure 中,我们使用 proxy 宏来做到这一点,所以我们会有这样的东西:

(def painting-panel
  (proxy [JPanel] []))

下一步是创建类构造函数并设置一些变量。

  1. 我可以在 proxy 的第二个参数之后定义函数,但是我如何创建构造函数? painting-panel 是这个类的名称吗(因此我应该创建的函数的名称)?

  2. 如何处理类变量?我应该像我那样用 let 定义它们吗?

  3. thissuper 是否可供我使用,就像我在下面所做的那样?

(def painting-panel
  (let [background-image (Image.)
          point-clicked (Point.)]
    (proxy [JPanel] []
        (paintComponent [g]
          (do ((.paintComponent super) g)
            (doto g
              (.drawImage background-image 0 0 nil)
              (.fillRect (.x point-clicked) (.y point-clicked) 1 1))))
        (painting-panel []; constructor?
          ((.addMouseListener this)
             (proxy [MouseAdapter] []
               (mouseClicked [e]
                 (do
                   (def point-clicked (.getPoint e)) 
                   (.repaint this)))))))))

也欢迎提出建议和代码更正!

谢谢!

最佳答案

  1. proxy 实际上创建了一个实例 tada!您不需要创建构造函数。

  2. 是的,但请考虑改用 clojure ref。在倒数第二行使用 def 也很讨厌!当您的逻辑依赖于 let 创建的词法作用域时,它会为点击创建一个全局绑定(bind)。

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

关于swing - 图像处理、扩展 JPanel 和模拟 Clojure 中的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1518933/

相关文章:

performance - 使用差分法在 Clojure 中实现序列推理

Java paintComponent 覆盖版本 5 和 6 之间的差异

java - 具有多个 JTextAreas 的 JScrollPane

java GUI 多线程与套接字

lisp - 将数字列表分解为数字

lisp - 无法访问用 make-package 定义的新包中的 CL-USER 符号?

Clojure:使用 eval 发生内存泄漏

java - JPanel 按键监听器

Lisp - if 语句各种 Action

clojure - 在不运行的情况下创建 Clojure future