[英]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.