Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Clojure——如何使用deftype定义公共可变成员?_Java_Clojure_Javafx 2_Deftype_Gen Class - Fatal编程技术网

Java Clojure——如何使用deftype定义公共可变成员?

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跑步

我发现通过在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可访问类


谢谢。

不,您不能在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注释,在编写本文时可能不可能