簡體   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