Can';t使用FXMLLoader在Clojure中加载FXML

Can';t使用FXMLLoader在Clojure中加载FXML,clojure,javafx,fxml,Clojure,Javafx,Fxml,我正在尝试实现这里显示的基本JavaFX示例:。我能够让基本的东西工作(以编程方式创建gui)并使用css,但我在FXMLLoader方面遇到了问题 java版本如下: @Override public void start(Stage stage) throws Exception { Parent root = FXMLLoader.load(getClass().getResource("fxml_example.fxml")); stage.setTitle("FXML

我正在尝试实现这里显示的基本JavaFX示例:。我能够让基本的东西工作(以编程方式创建gui)并使用css,但我在FXMLLoader方面遇到了问题

java版本如下:

@Override
public void start(Stage stage) throws Exception {
   Parent root = FXMLLoader.load(getClass().getResource("fxml_example.fxml"));

    stage.setTitle("FXML Welcome");
    stage.setScene(new Scene(root, 300, 275));
    stage.show();
}
我不是Java专家,但我不认为FXMLLoader对象是实例化的,即没有
newFXMLLoader()语句。那么
加载从何而来

当我尝试以下clojure代码时:

(ns jfxtwo.core
  (:gen-class
   :extends javafx.application.Application)

  (:import (javafx.application Application)
           (javafx.fxml FXMLLoader)
           (javafx.scene Parent Scene)
           (javafx.stage Stage)))

(defn -main []
  (javafx.application.Application/launch jfxtwo.core (into-array String [])))

(defn -start [this primaryStage]
  (let [loc (clojure.java.io/resource "fxml_example.fxml")
        root (.load FXMLLoader ^java.net.URL loc)
        scene (Scene. root 300 250)]
    (.setScene primaryStage scene)
    (.show primaryStage)))
…我得到的
原因是:java.lang.IllegalArgumentException:未找到匹配的方法:load for class java.lang.class

所以我在FXMLLoader后面加了一个点来创建一个实例:
(FXMLLoader.)
我得到了这个:
ClassCastException java.net.URL不能转换为java.io.InputStream

因此,这告诉我我了解了一些事情,因为fxmloader的
load
方法之一支持InputStream。我试图通过将对
(clojure.java.io/resource…
的调用直接放在对
(.load…
的调用中)来强制编译器知道资源是java.net.URL,因为这是
fxmloader.load
支持的重载之一,但它仍然不喜欢它(我知道这是一个漫长的过程)。我还尝试了类型暗示,
(.load(fxmloader.)^java.net.URL loc)
(.load(fxmloader.)#^java.net.URL loc)
,但没有骰子;它仍然尝试使用java.io.InputStream版本的
load

java中还有一个getClass()调用,我认为它获得了应用程序的超类,但我不确定在clojure land中如何处理它

关于如何加载fxml文件有什么想法吗

之后,java代码有
@FXML
注释,用于允许FXML进入私有类成员。这在clojure中是必要的吗(当我删除它时,java代码会中断)?clojure中似乎没有使用@Override注释


感谢给定Java语法,此处调用的
load
方法似乎是
FXMLLoader
类的静态方法。要在Clojure中调用静态方法,需要使用
(ClassName/methodName args…)
语法:

(FXMLLoader/load ...)
(刚刚选中:
fxmloader
既有静态方法,也有实例
load
方法,具有多个签名。您需要调用与Java代码相同的方法;静态方法将使用Java中的
fxmloader.load
语法,实例方法--
somefxmloaderInstance.load


至于
getClass
方法调用,它的目标在Java中隐式地是
this
;在Clojure中,您必须使目标显式(
(.getClass this)
)。

我可以通过创建FXMLLoader和设置位置来解决问题

(defn -start [this primaryStage]
  (let [loc (clojure.java.io/resource "fxml_example.fxml")
        fxmlloader (FXMLLoader.)]
    (.setLocation fxmlloader loc) 
    (let [root (.load fxmlloader )
          scene (Scene. root 300 250)]
      (.setScene primaryStage scene)
      (.show primaryStage))))

谢谢,使用静态方法很有效。但是,当我尝试直接使用
(.getResource(.getClass this)“fxml\u example.fxml”)
而不是
clojure.java.io/resource
时,它返回了nil,加载失败。没关系,我会坚持到底。