首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure --如何使用deftype定义公共可变成员?

Clojure --如何使用deftype定义公共可变成员?
EN

Stack Overflow用户
提问于 2013-05-20 00:01:38
回答 2查看 538关注 0票数 2

我一直在尝试让http://docs.oracle.com/javafx/2/get_started/fxml_tutorial.htm在clojure中运行。

我发现,通过在java版本中省略@FXML注释并将其公之于众,从:

代码语言:javascript
复制
public class FXMLExampleController {
    @FXML private Text actiontarget; 
    @FXML protected void handleSubmitButtonAction(ActionEvent event) {
        actiontarget.setText("Sign in button pressed");
    }
} 

至:

代码语言:javascript
复制
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可访问类?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-20 00:08:31

不,您不能在Clojure中定义公共可变字段。这对deftypegen-class都适用。

我认为您可以尝试了解JavaFX是否乐于调用getter,如果愿意,则在Clojure中定义一些getFoo方法。

票数 3
EN

Stack Overflow用户

发布于 2016-08-28 03:48:05

这是一个很晚的答案,但如果我发现了这个问题,其他人可能也会……:)

我在OP中遇到了同样的问题(也就是,我试图在clojure中复制javafx教程中的FXML示例),下面是我的解决方案:

1)使用我的FXML中需要的所有方法创建一个接口,用于事件驱动交互(在我的例子中只有一个方法,它反映了示例中间控制器中定义的方法):

代码语言:javascript
复制
(definterface MyFXMLControllerMethods                                                                                                                 
  (^void handleSubmitButtonAction (^javafx.event.ActionEvent event )))

2)然后使用deftype实例化一个实现接口的新java类型,并使用@FXML注释定义一个私有可变字段:

代码语言:javascript
复制
(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手动初始化每个字段(我尝试过)或使用内省(没有尝试过)。

希望这能有所帮助

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16636601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档