遵循此处的 JavaFX 教程:http: //docs.oracle.com/javafx/2/get_started/fxml_tutorial.htm,尝试使其在 Clojure 中运行。现在我只是lein run
在设置:aot :all
和使用(:gen-class)
等之后才做。花了几天的时间弄清楚,但现在它似乎大部分都在工作。
在src/jfxtwo/ClojureExampleController.clj
:
(defn -handleSubmitButtonAction [^ActionEvent event]
(let [actiontarget (Text.)]
(println "event button pressed")
(println "Event instance:" event)
(println "Event class:" (class event))
(.setText actiontarget "Sign in button pressed...")))
在resources/fxml_example.fxml
:
<GridPane fx:controller= "jfxtwo.ClojureExampleController"
xmlns:fx= "http://javafx.com/fxml"
alignment= "center" hgap= "10" vgap= "10"
styleClass= "root" >
...
<Button text= "Sign In"
onAction= "#handleSubmitButtonAction" />
...
<Text fx:id= "actiontarget"
GridPane.columnIndex= "1" GridPane.rowIndex= "6" />
...
我的 clojure 代码能够读取 fxml 和 css 文件以生成正确的 GUI。当我按下按钮时,我可以看到正在调用的事件处理程序,但我不知道如何访问Text
我想要更改的,或者ActionEvent
与按钮按下相关联的实例。我尝试(println event)
并(println (class event))
期望看到有关ActionEvent
实例的某些信息,但这只会向我展示无论出于何种原因,回调函数都认为该事件是 a ClojureExampleController
,即使类型提示说它应该是 a ActionEvent
:
event button pressed
Event instance: #<ClojureExampleController jfxtwo.ClojureExampleController@3e61061d>
Event class: jfxtwo.ClojureExampleController
执行此操作的 Java 代码如下所示:
public class JFXAppSampleController {
@FXML private Text actiontarget;
@FXML protected void handleSubmitButtonAction(ActionEvent event) {
actiontarget.setText("Sign in button pressed");
}
}
清除@FXML
注释在这里起到了神奇的作用。发生了什么事,我如何在 Clojure 中完成这项工作?
此外,有没有办法将按钮按下直接绑定到 FXML 中的文本更改,所以我真的不必在代码隐藏中处理 gui->gui 更改,而只需处理与按钮按下?我猜是的,但我在教程中还没有达到这一点。
谢谢!