Java Clojure——如何使用deftype定义公共可变成员?
我一直想在clojure跑步 我发现通过在java版本中省略@FXML注释并将其公开, 发件人: 致: …当我单击按钮时,它基本上仍然有效,fxml能够访问控制器的公共文本actiontarget,其访问通常仅通过@fxml注释启用 因此,我试图使基于clojure的控制器类具有公共可变字段,但在过去几个小时的研究中:gen类和deftypes,我找不到一种方法使其工作。我可以从java测试代码中访问最终的默认deftype字段,但我看到的唯一一个在线讨论是,不能有公共字段和可变字段,请尝试:gen class。我在gen类中也找不到,我能找到的所有gen类示例都只在clojure中使用类字段;我不知道如何在一个:gen类中定义:state,以便可以从java访问它,我也不知道如何使这些是可变的和公共的 我的下一件事是尝试clojure注释,然后使用fx:script字段而不是fx:controller来定义clojure回调。。。但我想首先确保它在deftype或gen类中是可行的/不可行的 那么,有人能告诉我,在clojure中是否可以使用公共可变字段创建一个java可访问类Java Clojure——如何使用deftype定义公共可变成员?,java,clojure,javafx-2,deftype,gen-class,Java,Clojure,Javafx 2,Deftype,Gen Class,我一直想在clojure跑步 我发现通过在java版本中省略@FXML注释并将其公开, 发件人: 致: …当我单击按钮时,它基本上仍然有效,fxml能够访问控制器的公共文本actiontarget,其访问通常仅通过@fxml注释启用 因此,我试图使基于clojure的控制器类具有公共可变字段,但在过去几个小时的研究中:gen类和deftypes,我找不到一种方法使其工作。我可以从java测试代码中访问最终的默认deftype字段,但我看到的唯一一个在线讨论是,不能有公共字段和可变字段,请尝试:g
谢谢。不,您不能在Clojure中定义公共可变字段。这适用于deftype和gen类
我想你可以试试看JavaFX是否愿意调用getter,如果愿意,可以在Clojure中定义一些getFoo方法。不,你不能在Clojure中定义公共可变字段。这适用于deftype和gen类
我想您可以尝试找出JavaFX是否愿意调用getter,如果愿意,可以在Clojure中定义一些getFoo方法。作为答案已经很晚了,但是如果我发现这个问题,其他人也可能会…: 我遇到了与OP相同的问题,也就是说,我试图在clojure中复制javafx教程中的FXML示例,这是我的解决方案: 1使用FXML中所需的所有方法创建一个接口,用于事件驱动交互,在我的示例中仅创建一个,它反映了示例中间控制器中定义的方法:
(definterface MyFXMLControllerMethods
(^void handleSubmitButtonAction (^javafx.event.ActionEvent event )))
2然后使用deftype实例化一个实现接口的新java类型,这是一件非常有趣的事情,用@FXML注释定义一个私有可变字段:
(deftype MyFXMLController [^{:volatile-mutable true javafx.fxml.FXML true} actiontarget]
MyFXMLControllerMethods
(^void handleSubmitButtonAction [this ^javafx.event.ActionEvent event]
(.setText actiontarget "Sign in button pressed!"))
Initializable
(^void initialize [this ^java.net.URL location ^java.util.ResourceBundle resources]
(assert (not= actiontarget nil)))) ; this test passes! =)
正如OP正确指出的,这是允许FXML加载程序通过内省访问控制器私有字段的关键
这种方法的优点在于,它不需要静态编译,因此,除了应用程序类之外,其他一切都可以是动态的
其他解决方案可能涉及使用查找工作手动初始化每个字段,我尝试过或使用内省没有尝试过
希望这有助于很晚才找到答案,但如果我发现这个问题,其他人也可能会…: 我遇到了与OP相同的问题,也就是说,我试图在clojure中复制javafx教程中的FXML示例,这是我的解决方案: 1使用FXML中所需的所有方法创建一个接口,用于事件驱动交互,在我的示例中仅创建一个,它反映了示例中间控制器中定义的方法:
(definterface MyFXMLControllerMethods
(^void handleSubmitButtonAction (^javafx.event.ActionEvent event )))
2然后使用deftype实例化一个实现接口的新java类型,这是一件非常有趣的事情,用@FXML注释定义一个私有可变字段:
(deftype MyFXMLController [^{:volatile-mutable true javafx.fxml.FXML true} actiontarget]
MyFXMLControllerMethods
(^void handleSubmitButtonAction [this ^javafx.event.ActionEvent event]
(.setText actiontarget "Sign in button pressed!"))
Initializable
(^void initialize [this ^java.net.URL location ^java.util.ResourceBundle resources]
(assert (not= actiontarget nil)))) ; this test passes! =)
正如OP正确指出的,这是允许FXML加载程序通过内省访问控制器私有字段的关键
这种方法的优点在于,它不需要静态编译,因此,除了应用程序类之外,其他一切都可以是动态的
其他解决方案可能涉及使用查找工作手动初始化每个字段,我尝试过或使用内省没有尝试过
希望这能有所帮助谢谢,这就是我的感受。我突然想到,也许有其他方法可以让fxml通过属性、setter、getter等与java对象通信,但我还没有找到这种方法。你现在可以添加相同的@fxml注释,这在编写hanks时可能是不可能的,这是我得到的感觉。我突然想到,也许有其他方法可以让fxml通过属性、setter、getter等与java对象进行对话,但我还没有找到这种方法。您现在可以添加相同的@fxml注释,在编写本文时可能不可能