ここに示す基本的な JavaFX の例を実装しようとしています: http://docs.oracle.com/javafx/2/get_started/fxml_tutorial.htm。基本的な作業 (プログラムで 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 オブジェクトがインスタンス化されているとは思いません。new FXMLLoader();
声明はありません。では、 はどこload
から来ているのでしょうか。
次の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)))
...わかりCaused by: java.lang.IllegalArgumentException: No matching method found: load for class java.lang.Class
ました。
そこで、FXMLLoader の後にドットを追加してインスタンスを作成します。次の(FXMLLoader.)
ようになります。ClassCastException java.net.URL cannot be cast to java.io.InputStream
これはload
、FXMLLoader のメソッドの 1 つが InputStream をサポートしているため、何かに取り組んでいることを示しています。リソースがjava.net.URLであることをコンパイラに強制的に認識させようとしました。これは、 のサポートされているオーバーロードの 1 つであるためFXMLLoader.load
です。ショット)。タイプヒンティングも試しましたが、サイコロはありませんでした。の java.io.InputStream バージョンを引き続き使用しようとします。 (clojure.java.io/resource...)
(.load...)
(.load (FXMLLoader.) ^java.net.URL loc)
(.load (FXMLLoader.) #^java.net.URL loc)
load
アプリケーションのスーパークラスを取得していると思われるJavaのgetClass()呼び出しもありますが、clojure-landでそれをどうするかわかりません。
fxml ファイルをロードする方法についてのアイデアはありますか?
その後、Java コードには@FXML
、FXML をプライベート クラス メンバーに許可するための注釈があります。これは clojure で必要ですか (削除すると Java コードが壊れます)? @Override アノテーションは clojure では使用されていないようです。
ありがとう