在 Clojure 中使用 "proxy" 的 IllegalArgumentException
IllegalArgumentException using "proxy" in Clojure
我按照本教程学习了 clojure(https://www.youtube.com/watch?v=zFPiPBIkAcQ 大约 2:26)。在最后一个示例中,您编写了游戏“贪吃蛇”。
(ns ...tests.snake
(:import
(java.awt Color Dimension)
(javax.swing JPanel JFrame Timer JOptionPane)
(java.awt.event ActionListener KeyListener KeyEvent)))
...
113 (defn game-panel [frame snake apple]
114 (proxy [JPanel ActionListener KeyListener] []
115 ;JPanel
116 (paintComponent [g]
117 (proxy-super paintComponent g)
118 (paint g @apple)
119 (paint g @snake))
120 (getPreferredSize []
121 (Dimension. (* (inc field-width) point-size)
122 (* (inc field-height) point-size)))
123 ;ActionListener
124 (actionPerformed [e]
125 (update-positions snake apple)
126 (if (lose? @snake)
127 (do
128 (reset-game snake apple)
129 (JOptionPane/showMessageDialog frame "You lose")))
130 (if (win? @snake)
131 (do
132 (reset-game snake apple)
133 (JOptionPane/showMessageDialog "You win")))
134 (.repaint this))
135 (keyPressed [e]
136 (let [direction (directions (.getKeyCode e))]
137 (if direction
138 (update-direction snake direction))))
139 (keyReleased [e])
140 (keyTyped [e])))
我在使用“代理”时收到 IllegalArgumentException。
; Syntax error (IllegalArgumentException) compiling new at (c:\[...]\Clojure_Project\tests\snake.clj:114:3).
; Unable to resolve classname: ...tests.snake.proxy$javax.swing.JPanel$ActionListener$KeyListenerb88ffec
起初我以为这可能与我传递多个参数有关,但那似乎不是问题。
我使用 VisualStudioCode 和 Calva 的“Getting Starting REPL”(因为我不知道如何连接另一个)。
我不知道,我是不是忘记安装或导入什么东西了?
我试着看一下“代理”的代码,但由于我对编程语言还不是很熟悉,所以对我帮助不大。
最初查看您的问题时,我认为您的 ...tests.snake
命名空间只是您省略的内容,而不是实际的命名空间名称。
但是鉴于您的回购协议,它似乎是您正在使用的真实命名空间名称。
这是无效的 - 您不能使用 .
启动命名空间。将其重命名为 tests.snake
,错误将消失。
不幸的是,您在 repo 中的代码仍然无法运行,因为还有许多其他错误,但您应该很容易自己找出这些错误。作为一般性建议 - 不要 运行 通过将单独的表格发送到 REPL 来处理整个项目。了解如何使用单个命令启动它 - 它会产生良好的实践,即使在使用 REPL 时也很有用。
我按照本教程学习了 clojure(https://www.youtube.com/watch?v=zFPiPBIkAcQ 大约 2:26)。在最后一个示例中,您编写了游戏“贪吃蛇”。
(ns ...tests.snake
(:import
(java.awt Color Dimension)
(javax.swing JPanel JFrame Timer JOptionPane)
(java.awt.event ActionListener KeyListener KeyEvent)))
...
113 (defn game-panel [frame snake apple]
114 (proxy [JPanel ActionListener KeyListener] []
115 ;JPanel
116 (paintComponent [g]
117 (proxy-super paintComponent g)
118 (paint g @apple)
119 (paint g @snake))
120 (getPreferredSize []
121 (Dimension. (* (inc field-width) point-size)
122 (* (inc field-height) point-size)))
123 ;ActionListener
124 (actionPerformed [e]
125 (update-positions snake apple)
126 (if (lose? @snake)
127 (do
128 (reset-game snake apple)
129 (JOptionPane/showMessageDialog frame "You lose")))
130 (if (win? @snake)
131 (do
132 (reset-game snake apple)
133 (JOptionPane/showMessageDialog "You win")))
134 (.repaint this))
135 (keyPressed [e]
136 (let [direction (directions (.getKeyCode e))]
137 (if direction
138 (update-direction snake direction))))
139 (keyReleased [e])
140 (keyTyped [e])))
我在使用“代理”时收到 IllegalArgumentException。
; Syntax error (IllegalArgumentException) compiling new at (c:\[...]\Clojure_Project\tests\snake.clj:114:3).
; Unable to resolve classname: ...tests.snake.proxy$javax.swing.JPanel$ActionListener$KeyListenerb88ffec
起初我以为这可能与我传递多个参数有关,但那似乎不是问题。
我使用 VisualStudioCode 和 Calva 的“Getting Starting REPL”(因为我不知道如何连接另一个)。
我不知道,我是不是忘记安装或导入什么东西了? 我试着看一下“代理”的代码,但由于我对编程语言还不是很熟悉,所以对我帮助不大。
最初查看您的问题时,我认为您的 ...tests.snake
命名空间只是您省略的内容,而不是实际的命名空间名称。
但是鉴于您的回购协议,它似乎是您正在使用的真实命名空间名称。
这是无效的 - 您不能使用 .
启动命名空间。将其重命名为 tests.snake
,错误将消失。
不幸的是,您在 repo 中的代码仍然无法运行,因为还有许多其他错误,但您应该很容易自己找出这些错误。作为一般性建议 - 不要 运行 通过将单独的表格发送到 REPL 来处理整个项目。了解如何使用单个命令启动它 - 它会产生良好的实践,即使在使用 REPL 时也很有用。