2017-09-26 46 views
1

我正尝试在Clojure中编写JavaFX应用程序。作为一个简单的测试,我想尝试启动一个Hello World。要延长Application,我决定尝试使用proxy而不是:gen-class。我希望能够创建一个创建Application的简单函数,而不是每次都要求我写样板。创建JavaFX代理会导致UnsupportedOperationException

我想出了一个简单的例子是:

(let [^Application app 
     (proxy [Application] [] 
     (start [self stage] (println "Hello World")))] 

    (Application/launch ^Class (.getClass app) 
         (into-array String []))) 

的问题是,这会导致UnsupportedOperationException

UnsupportedOperationException异常启动chat.graphics_tests.javafx_wrapper.proxy $ javafx.application.Application $ ff19274a.start(:-1)

它似乎找不到start方法t我实施的帽子。我的第一个想法是,start的论点是错误的。他们似乎是正确的。它收到的第一个参数是“this”,然后是主要阶段。尽管我尝试了不同数量的参数,但我仍然得到相同的错误。根据文档:

如果接口方法不提供一种方法,FN,一个 则将抛出UnsupportedOperationException它应该是 调用。

更进一步我这个怀疑。

错误很模糊。有没有人看到问题是什么?

+0

我刚刚读到'proxy'不能用在这里,因为'Application/launch'需要一个命名类。猜猜我正在使用':gen-class'。 – Carcigenicate

回答

0

在Clojure中编写proxy类定义时,您不需要方法签名中显式的self参数。当前实例将隐式绑定到this,您可以在方法中使用该实例。

因此您的代理呼叫应该是这样的:

(proxy [Application] [] 
    (start [stage] (println "Hello World"))) 
+0

不,同样的错误。正如我所说,我尝试了许多不同的论点组合。而且,正如我在我的回答下的评论中提到的那样,我后来读到'proxy'不能用在这里。我决定留下这个问题以防其他人试图使用'proxy'。我怀疑他们会得到相同的错误信息。 – Carcigenicate

相关问题