繁体   English   中英

Clojure和JavaFX 2.0 —如何从clojure回调函数访问元素的ID

[英]Clojure and JavaFX 2.0 — How to access element's ID from clojure callback function

在此处遵循JavaFX教程: http : //docs.oracle.com/javafx/2/get_started/fxml_tutorial.htm ,尝试使其在Clojure中运行。 现在,我只是在设置:aot :all和带有(:gen-class)等的东西之后进行lein run 。花了几天的时间弄清楚了,但是现在看来它几乎可以正常工作了。

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实例的内容,但这只会导致我知道无论出于何种原因,回调函数都认为该事件是ClojureExampleController ,即使类型提示表明它应该是一个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");
   }
}

Clearle @FXML注释在这里@FXML了神奇的作用。 发生了什么事,我如何在Clojure中进行这项工作?

另外,是否有一种方法可以将按钮按下直接绑定到FXML中的文本更改,所以我实际上不必在后面的代码中处理gui-> gui更改,而只需处理与按下按钮? 我猜是的,但是在本教程中我还没有提到这一点。

谢谢!

您需要在处理程序中明确指定this参数:

(defn -handleSubmitButtonAction [this ^ActionEvent event]
  ...)

也许更准确的说法是event 问题文本中显示的处理程序中的this参数,您需要添加第二个参数以接受事件并将类型提示移至该事件(并可能将第一个重命名)参数this为可读性)。

考虑到您的代码完全被调用的事实,如果JavaFX不关心它,似乎很乐意调用处理程序而不将事件传递给它(通过没有与之对应的形式参数来证明) 。

类型提示的唯一目的是允许Clojure编译器避免在event上调用ActionEvent方法时发出反射代码。 这不会阻止将其他类型的对象传递给函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM