我一直在尝试让http://docs.oracle.com/javafx/2/get_started/fxml_tutorial.htm在clojure中运行。
我发现,通过在java版本中省略@FXML注释并将其公之于众,从:
public class FXMLExampleController {
@FXML private Text actiontarget;
@FXML protected void handleSubmitButtonAction(ActionEvent event) {
actiontarget.setText("Sign in button pressed");
}
} 至:
public class FXMLExampleController {
public Text actiontarget;
public void handleSubmitButtonAction(ActionEvent event) {
actiontarget.setText("Sign in button pressed");
}
}当我单击按钮时,它基本上仍然有效,并且...that能够访问控制器的public Text actiontarget,它的访问通常只能通过@FXML注释来启用。
因此,我试图让我的基于clojure的控制器类具有公共可变字段,但在最后几个小时的搜索中:gen-class和deftype,我找不到一种方法来使其工作。我可以从java测试代码中访问final (默认) deftype字段,但我看到的唯一在线讨论是不能有公共和可变字段,并尝试:gen-class。嗯,我在gen-class中也找不到,而且我所能找到的所有gen-class示例都只能使用clojure中的class字段;我不确定如何在:gen-class中定义:state,以便可以从java访问它,我也不知道如何使这些字段成为可变的和公共的。
我的下一件事是尝试clojure注释,然后使用fx:script字段而不是fx:controller来定义clojure回调...但我想首先确保它在deftype或gen-class中是可行的或不可实现的。
那么,有没有人能告诉我,是否有可能在clojure中创建一个具有公共可变字段的java可访问类?
谢谢。
发布于 2013-05-20 00:08:31
不,您不能在Clojure中定义公共可变字段。这对deftype和gen-class都适用。
我认为您可以尝试了解JavaFX是否乐于调用getter,如果愿意,则在Clojure中定义一些getFoo方法。
发布于 2016-08-28 03:48:05
这是一个很晚的答案,但如果我发现了这个问题,其他人可能也会……:)
我在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加载器通过内省访问控制器的私有字段的关键。
这种方法的真正好处是它不需要静态编译,因此,除了Application class之外,其他所有东西都可以是动态的。
其他解决方案可能涉及使用lookup手动初始化每个字段(我尝试过)或使用内省(没有尝试过)。
希望这能有所帮助
https://stackoverflow.com/questions/16636601
复制相似问题