29

FX初心者です。10 個のタブを持つ TabPanel があります。各タブには多くのコントロール (チャート、ボタンなど) があり、私が望むのは各タブにコントローラーを割り当てることです。SceneBuilder では、ビュー全体にコントローラーを割り当てることしかできません。つまり、トップ パネル (ルート) だけに「コントローラー クラス」オプションがあるため、すべてのタブのコードを 1 つのクラスに記述しなければなりません。その結果、クラスが非常に大きくなり、理解と保守が困難になります。おそらく解決策は非常に単純ですが、私が言うように、私はFXの経験がほとんどなく、ウェブ上で同様のものを見つけることができませんでした.

何か案が?ありがとうございました。

4

1 に答える 1

87

1 つの方法は、各タブ ページを個別の FXML ファイルにカプセル化し、独自のコントローラ クラスを関連付けることです。

次に、メイン タブ コントロールの FXML ファイルで、次のような操作を実行できます。

<TabPane fx:controller="com.foo.MainController">
    <tabs>
        <Tab text="Untitled Tab 1">
            <content>
                <fx:include fx:id="fooTabPage" source="fooTabPage.fxml"/>
            </content>
        </Tab>
        <Tab text="Untitled Tab 2">
            <content>
                <fx:include fx:id="barTabPage" source="barTabPage.fxml"/>
            </content>
        </Tab>
    </tabs>
</TabPane>

コンテンツを直接埋め込むのではなく、参照されている FXML ファイルをロードするように指示するfx:includeディレクティブを使用していることに注意してください。FXMLLoaderページ コンテンツに使用される個々の FXML ファイルにはすべて独自のコントローラーがあり、ロジックが適切に分離されています。

メイン コントローラーからサブページまたはサブコントローラーとやり取りする必要がある場合は、他の FXML コントロールと同様にそれらを参照して、それらを挿入することができます。

public class MainController {
    // Inject tab content.
    @FXML private FooTabPage fooTabPage;
    // Inject controller
    @FXML private FooTabController fooTabPageController;

    // Inject tab content.
    @FXML private BarTabPage barTabPage;
    // Inject controller
    @FXML private BarTabController barTabPageController;
}

多数のページ (それぞれに多数の独自のコントロールがある) がある場合、別の方法として、各タブを空のままにし、メイン ビューが読み込まれたら、関連するページをコントロールに読み込みます。

タブの変更をリッスンしてコンテンツを切り替え、関連するコードを追加して、タブ ページのコンテンツに使用されているビューをロード/アンロードする必要があります。

最初のアプローチから始めて、パフォーマンスの問題が見つかった場合はリファクタリングして 2 番目のアプローチを使用することをお勧めします。

于 2013-11-10T12:59:22.373 に答える