1

もちろん、簡単な例を作成することに直接飛び込みます。

public class Main extends Application {

URL bla = getClass().getResource("/sample.fxml");

@Override
public void start(Stage primaryStage) throws Exception{
    //If you get weird errors: http://zenjava.com/javafx/maven/fix-classpath.html
        //but not actually my issue. Example displays fine in intellij.

    try {

        FXMLLoader loader = new FXMLLoader(bla);
        Parent root = loader.load(bla);

        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root));
        primaryStage.show();

        Controller controller = loader.<Controller>getController() ;
        assert(controller != null);
        controller.getLabel().setText("Kaboom!");
    } catch (Exception e) {
        // Exception gets thrown if the fxml file could not be loaded
        e.printStackTrace();
    }
}

public static void main(String[] args) {
    launch(args);
}
}

https://forums.oracle.com/thread/2317621を読みまし たが、上部のアンカーペインが fxml でコントローラーを指す必要があることを知っています。

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity"      minWidth="-Infinity" prefHeight="600.0" prefWidth="800.0" xmlns:fx="http://javafx.com/fxml" fx:controller="mypackage.Controller">
  <children>

正常に表示されますが、コントローラーがないため、アサーションがキャッチされます!
また、initialize()実際に実行されます。つまり、次のコントローラーが作成されます。

public class Controller {

@FXML
private Label label ;

public Label getLabel()
{
    return label ;
}

@FXML
public void initialize()
{
    System.out.println("Swear a lot!");
    System.out.println(label);
}
}

これを見ているFX開発者への注意:

クラスを指す xml ファイルに弱結合文字列を含める場合、探しているものが見つからない場合、.load() が意味のある実行時例外をスローすることを本当に期待しています。null を返す言い訳はありません... 理想的には、GWT ウィジェット チームからページを取得し、プログラムが実際に開始される前にプリコンパイラが失敗するようにするか、人気のある IDE のプラグインを実行するのが最善です。

さらに、JavaFXのソースコードをJavaFX用に起動して実行する(mavenに入れる)のは本当に簡単にする必要があります。そうすれば、自動的にダウンロードでき、問題が何であるかを自分で解決できます。あまりにもハード。

私が間違っている単純なことがあると確信していますが、ツールは私をこれから救ってくれるはずです。

4

2 に答える 2

6

このようなコントローラークラスを取得できるようにするには

Controller controller = loader.<Controller>getController();

インスタンス化された FXMLLoader の読み込みメソッドを呼び出す必要があります

Parent root = loader.load(bla);

ここで load() は static であり、呼び出します

Parent root = (Parent) loader.load(bla.openStream());

しかし、私はそれが十分に文書化されるべきであることに同意します。

于 2013-08-23T13:28:21.880 に答える
1

Ulukの回答は、質問で提起された主な問題にすでに対処しています。

この「回答」は、補助的な質問のみに対応しています。

探しているものが見つからない場合、 .load() が意味のある実行時例外をスローすることを本当に期待しています。

API の変更、例外メッセージの変更、またはドキュメントの改善要求については、 JavaFX 課題トラッカーに微調整の問題を記録してください。この場合、それはドキュメンテーションと API の使用法の明確化のように思えます。

また、FXML ファイルの使用はオプションであることに注意してください。FXML で実行できることはすべて、Java API でも直接実行できるため、「クラスを指す xml ファイルに弱結合文字列を含める」必要はありません。

この弱い文字列結合がある場合、Idea 12.1+などの一部の開発環境では、増分検証、チェック、エラー構文の強調表示、および fxml/コード ナビゲーションが実行されます。したがって、現在のツールは、いくつかの落とし穴をある程度回避するのに役立ちます (ただし、投稿で参照されている特定の問題についてはそうではない可能性があります)。Java フレームワークは長い間 IDE で XML と統合されてきましたが、これは完璧な組み合わせではありませんが、IDE 開発者はいくつかの最悪の問題点に対処することに熟達しています。

さらに、JavaFXのソースコードをJavaFX用に起動して実行する(mavenに入れる)のは本当に簡単にする必要があります。そうすれば、自動的にダウンロードでき、問題が何であるかを自分で解決できます。

JavaFX イシュー トラッカーには、JavaFX ソース コードを JDK にバンドルするための既存のリクエストがあります。この問題は、Java 8 のリリース前に実装される予定です。このソリューションは、JavaFX 2.2 などの以前の JavaFX バージョンには適用できません。これらのバージョンはほとんどがクローズド ソースであるためです。

それまでの間、open-jfx リポジトリからソース コードを取得する代替ソリューションに興味があるかもしれません。これは、JavaFX ソース コードが表示されないへの回答に示されています。

私はopenJDKを見ましたが、それは使命のように見えました.

理解できる - open-jfx リポジトリからのソースを使用することは、JDK ディストリビューションに含まれているバンドルされた src.zip を新しい IDE プロジェクトによって自動的に参照するよりも複雑です (現在の jdk src.zip が IDE によって使用されるのと同じ方法で) )。

Java 8 リリースまでに、主要な IDE から JavaFX ソースに簡単にアクセスできる JavaFX ソース バンドルが実装されると確信しています。

ライブラリ自体がJDKディストリビューションの一部を形成するようになったため、JavaFXライブラリとコードをmavenリポジトリに配置することは良い解決策ではないと思います。JDK ディストリビューションの他のコードは、Maven リポジトリには含まれていません。おそらく、Java 9 がモジュール式の JDK アプローチを採用する頃には、これが変わる可能性があります。

Scene Builder が Java コードを作成/変更できない限り、xml を使用しないという推奨事項は心に訴えるものではありません。

FXML を使用しないことは推奨されません。これは、毎週型付けされた文字列言語を厳密に型付けされた Java 言語と一致させる XML ベースのアプローチを好まない人のための代替手段にすぎません。

FXML の使用に関して私が実際に行った唯一の推奨事項は、(IMO) として JavaFX 開発を最初に開始するときに FXML と SceneBuilder を使用しないことです。

  1. JavaFX ツールキットの原理を学ぶときは、API だけを使用する方が効率的です。
  2. 学ぶことが少ない。
  3. 正しく使用する方法がまだわからない複雑な UI 要素を自動的に生成する GUI ツールはありません。
  4. FXML ローダーがどのように機能するかについて、やや複雑で紛らわしく、文書化が不十分であることを心配する必要はありません。
  5. FXML ファイル内の UI 要素と Java コードの間の同期マッピングを維持することについて心配する必要はありません。
  6. 低レベルの API の観点から、レイアウトとシーン グラフの構造を理解する必要があります。

レイアウト デザイナーがチームに参加できるように、特に関心の分離を可能にするために UI テクノロジを評価している場合、懸念のリストはまったく無意味です。

確かに、機能横断的なチームの観点からの JavaFX テクノロジーの評価には、当然、FXML と SceneBuilder の使用の評価が含まれます。

JavaFX の新規開発者が API のみを使用して JavaFX の初期開発を行う理由は、実際には問題ではありません。これらは、開発者 (クロスファンクショナル エバリュエーターではない) が最初に JavaFX テクノロジを学習するときにのみ API に固執する理由についての私の意見です。

これをドキュメントの問題にするのは間違っているとは思いません。ユーザーに期待しすぎるからです。

それは理解できる感情です。おそらく、静的な FXMLLoader ロード メソッドを非推奨にすることは、そもそもこのようなユーザー エラーの可能性を防ぐためのより良い方法かもしれません。

とにかく、ドキュメントまたは実装の変更を要求する最も直接的な方法は、JavaFX 課題トラッカーで課題要求を作成し、 openjfx-dev メーリング リストで開発者と問題について話し合うことです。JavaFX は現在活発に開発されているため、そのような要求 (迅速に行われた場合) は、Java 8 のタイムフレームで実装される可能性が十分にあります。

さらに補助的な質問がある場合は、それらの質問の種類を最も適切に処理するフォーラム ( Oracle JavaFX フォーラムopenjfx-dev JavaFX メーリング リストなど) に投稿することをお勧めします。

于 2013-08-23T16:45:11.213 に答える