2

FXML を使用してカスタム コンポーネントを作成しています。カスタム コンポーネントは、階層的に設計されています。

別のカスタム コンポーネント A を使用するカスタム コンポーネント B を設計すると、シーンビルダーでクラスパスの問題ダイアログが表示され、適切なクラスパスを設定するだけでこれを修正できます。

ただし、A を含む B を含む C などの 3 つのコンポーネントを作成し、Scenebuilder でトップレベルのコンポーネント C を開こうとすると失敗します。正式に指定したクラスパスを要求されます。B は見つかりますが、A は見つかりません。

アプリケーションが適切に実行できるため、クラスパス、FXML、およびコードは正しいです。Scenebuilder のみに問題があります。

Scenebuilder で階層カスタム コンポーネントを開くにはどうすればよいですか?

FXML を使用した階層コンポーネント定義の例への参照は、非常に高く評価され、50 ポイントの報奨金を得ることができます。(必要なレベルは 3 つだけ)

4

1 に答える 1

0

David という名前の人がフォーラムであなたの質問に答えました。レガシーの目的で、ここに投稿します。

カスタム コンポーネントの Scene Builder のクラスローダーに問題があります。SceneBuilder で FXML ファイルをロードすると、独自のクラスローダーで FXMLLoader が使用されます。独自の FXMLLoader を使用して他のカスタム コンポーネントをロードするカスタム コンポーネントをロードするには、すべての FXMLLoader が同じクラスローダーを使用するようにする必要があります。David がフォーラムで述べたように、カスタム コンポーネントにこのコードを追加することでそれを実現できます。

public class CustomC extends VBox {
    public CustomC() {
        init();
    }

    private void init() {
        FXMLLoader loader = new FXMLLoader();
        loader.setRoot(this);
        loader.setLocation(this.getClass().getResource("CustomC.fxml"));

        // Make sure to load "CustomC.fxml" with the same classloader that
        // was used to load CustomC class. 
        loader.setClassLoader(this.getClass().getClassLoader());

        try {
           final Node root = (Node)loader.load();
           assert root == this;
        } catch (IOException ex) {
           throw new IllegalStateException(ex);
        }
    }
}

このコードをクラスに外部化する場合は、このクラスをカスタム コンポーネントと同じ jar に入れることが重要です。(少なくとも今のところ) 外部 jar に入れることはできません。

于 2013-09-03T08:46:27.540 に答える