1

ここに示す基本的な 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 では使用されていないようです。

ありがとう

4

2 に答える 2

1

場所の設定とは別に 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))))
于 2013-05-18T15:57:01.130 に答える
1

Java 構文を考えると、ここで呼び出されているメソッドは、クラスloadの静的メソッドのように見えます。Clojure で静的メソッドを呼び出すには、次の構文FXMLLoaderを使用する必要があります。(ClassName/methodName args...)

(FXMLLoader/load ...)

(チェックしたところ:複数の署名を持つFXMLLoader静的メソッドとインスタンスloadメソッドの両方があります。Javaコードと同じメソッドを呼び出す必要があります。静的メソッドはFXMLLoader.load、Javaの構文、インスタンスメソッド -- で呼び出されますsomeFXMLLoaderInstance.load。)

メソッド呼び出しに関しては、そのgetClassターゲットは暗黙的thisに Java にあります。Clojure では、ターゲットを明示的にする必要があります ( (.getClass this))。

于 2013-05-18T11:25:54.253 に答える