Can';t使用FXMLLoader在Clojure中加载FXML
我正在尝试实现这里显示的基本JavaFX示例:。我能够让基本的东西工作(以编程方式创建gui)并使用css,但我在FXMLLoader方面遇到了问题 java版本如下: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
@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,加载失败。没关系,我会坚持到底。