web-dev-qa-db-ja.com

FXMLからコントローラークラスを自動的に生成できますか?

私が理解しているように、[〜#〜] fxml [〜#〜]を使用してJava FXシーンを記述する場合、コントローラークラスは手動で記述され、そのメンバー変数とその後、メソッドは_.fxml_ファイルから参照できます。 FXMLLoaderを使用してシーンをロードすると、メンバー変数が対応するシーン要素に設定され、メソッドが対応するイベントに自動的に関連付けられます。これは機能しますが、変更は2か所で行う必要があり、間違いは実行時にしか表示されないため、非常に面倒です。

代わりに、シーンの説明からコントローラーを、シーン要素にアクセスしてイベントを処理するために実装する必要がある抽象クラスとして、コントローラーで生成できる他のGUIフレームワークを見てきました。私の意味の例:

次の_.fxml_ファイルを作成します(例:JavaFX Scene Builderを使用):

_<AnchorPane ... >
  <children>
     <Button fx:id="button" ... text="Button" onAction="#buttonPressed" />
  </children>
</AnchorPane>
_

ビルドプロセスのどこかで、次の_.Java_ファイルが作成されます(例:Mavenプラグインを使用):

_abstract class TestController {
    protected final Parent root;
    protected final Button button;

    {
        // Load test.fxml file
        // Assign scene elements to root and button
        // Attach event handler to the button that calls buttonClicked()
    }

    protected abstract void buttonClicked(ActionEvent event);
}
_

その後、おそらく複数回、そのコントローラーの具体的な実装を作成できます。

_final class TestControllerImpl extends TestController {
    TestControllerImpl(String buttonLabel) {
        button.setText(buttonLabel);
    }

    @Override
    protected void buttonClicked(ActionEvent event) {
        button.setText("I've been clicked! What a great day!");
    }
}
_

これを行うことを目的としたプロジェクトはありますか?または、このアプローチを[〜#〜] fxml [〜#〜]に適用すると問題が発生しますか?

このアプローチには次のような利点があります。

  • コントローラーのメンバー変数とメソッドの宣言が自動的に生成されます。
  • すべてのメンバー変数は、non-finalおよびpublicまたは注釈付きではなく、finalおよびprotectedです。
  • メソッドについても同じですが、それらはpublicまたは注釈の代わりにprotectedです。
  • メソッドを実装しないか、その名前のスペルを間違えると、コンパイラエラーが発生します。
  • コンストラクターはinitialize()メソッドの代わりにコンストラクターでプログラムによるシーンの設定を行うことができます。これは、コンストラクターが実行されるためですafterシーンが読み込まれ、その要素がメンバー変数に割り当てられます。
16
Feuermurmel

あなたがあなたの質問であなたが提案することを正確に行う私が知っていることは何もありません。

おそらく、この答えはおそらく時間の経過とともにかなり古くなるでしょう。

代替テクノロジー

JRuby は、少し異なるアプローチを使用して、概説された利点のほとんどを実現します-jRubyの動的プログラミングマジックを使用して、FXMLから動的にランタイムにRubyクラスメンバーを自動的に作成します。

Tom Schindlは、FXMLからJavaコードを生成するツールを作成しました。この回答にリストされているアプローチの中で、Tomのツールは質問に最も近いようです。

SceneBuilderスケルトン

同様のJavaコードジェネレーターがSceneBuilder View | Show Sample Controller Skeleton機能。これは ブログ投稿 で説明されています。 SceneBuilderを使用するときは、常にこの機能を使用し、コントローラーを非常に軽量にして、SceneBuilderのスケルトン機能からほとんどすべて自動生成されるコードにしようとしています。

ただし、生成されたコードと手書きのコードを明確に区別できないため、FXMLを更新し、新しいスケルトンを生成して、その一部にコピーして貼り付ける場合は、注意が必要です。既存のコントローラー(さらに、開発者の少し時間がかかる、少しエラーが発生しやすい手動操作です)。

SceneBuilderのソースコード は、動作を確認する場合に使用できます。

Potential Build Tool Plugins

このようなコード生成機能は、JavaFXエコシステムの既存のビルドツールのいくつかに、 JavaFX Mavenプラグイン または JavaFX Gradleプラグイン (または個別のそれ自体はプラグインです)。

今後の開発

Oracleは、FXMLを直接Javaバイトコードにコンパイルする、将来のJavaFXリリース(post Java 8))のFXMLの機能拡張にも取り組んでいると思いますクラスファイル)、Javaソースコードのステップをバイパスします。この種の機能は、概して、概説された利点のほとんどを達成します。

8
jewelsea

これは現在、SceneBuilder、NetBeans、およびEclipseでサポートされています。これはNetBeansとSceneBuilderではそのまま使用できますが、Eclipseでは最初にe(fx)clipseプラグインが必要です。

SceneBuilder:エディターでFXMLファイルを開いた状態で、メニューから「表示」と「サンプルコントローラースケルトンの表示」を選択します。

Eclipse:fxmlファイルを開いて、コード編集ペインにコンテンツが表示されるようにします(fxmlは、SceneBuilderで視覚的にレンダリングされるのではなく、Eclipse内で構文強調表示されたプレーンテキストxmlとして表示されます)。 Eclipseでコードを右クリックし、[コード]、[コントローラの生成]の順に選択します。

NetBeans:NetBeansではさらに簡単です。プロジェクトエクスプローラーでfxmlファイルを右クリックし、[コントローラーの作成]を選択します。

9
Mishax

NetBeansバージョン8で可能です。

FXMLを開き、Sourceに移動して、generate controllerをクリックします。

編集:IDEで実行できるようになりました。Eclipseにはプラグインの考え方が必要です。

7
user3224416

私が知っているように、netbeansには2種類のソリューションが存在します。

まず、netbeansの内部機能「Make Controller」。これは、fxmlドキュメントを右クリックすると表示されます。 FXMLLoaderで動作するコントローラークラスを生成します。コントローラーのJavaファイル名はfxmlドキュメントに示されている必要があります。(左パネル->コントローラー->コントローラークラス)

Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));

第二に、netbeansのプラグイン "FXML 2 Java Converter"で、メニューからインストールできます(ツール->プラグイン->利用可能なプラグイン-> FXML 2 Javaコンバーター)を選択すると、fxmlドキュメントを右クリックすると、[Generate Abstract Class]メニュー項目が表示されます。これにより、fxmlドキュメントからソースコードが生成され、JavaFXMLプロジェクトではなく、通常のJavaFXプロジェクトのようにFXMLLoaderを使用せずに、抽象クラスとして使用できます。

1
Chun

IntelliJ ideを使用している場合は、FXML Helperプラグイン。

まず、ファイルからプラグインをインストールします。設定... |プラグイン。インストール後、IDEを再起動します。次に。fxmlドキュメントを右クリックし、FXML Helperメニュー。それだけです。

0
ucMedia

あずきっく
いいえ.fxmlファイルのコントローラークラスを自動的に生成する方法はありません。
scence builderで@fxmlアノテーションとset(bind)アノテーションを使用して変数とメソッドを動的に宣言する必要があります。

0
Maulik Patel

これで、Eclipseで簡単に実行できます。次の単純な手順を実行するだけです。

  1. コントローラを作成するfxmlファイルに移動します
  2. 右クリックしてソースをクリック
  3. [コントローラの生成]をクリックします

方法の写真を見るにはここをクリックしてください。