3

現在、次の状況があります。

FXML コントローラによってバックアップされる FXML ファイルを作成しました。画面はサイドバーとチャイルドホルダーで構成されています。サイドバーの要素をクリックすると、次のように子ホルダーに追加の FXML ファイルが読み込まれます。

childHolder.getChildren().addAll(FXMLLoader.load(getClass().getResource("SidebarItem1.fxml")));

これはうまくいきます。しかし、親コントローラーのコントローラーにロードされた FXML のいくつかの要素にアクセスしたいと考えています。ロードした後、子 FXML の要素を初期化しました。

私はすでにこの質問を見ました: JAVAFX - FXML - Access Loaded FXML Controls from Parent Controllerですが、そのようにすると、まだエラーが発生します:

FXMLLoader loader = new FXMLLoader(getClass().getResource("SidebarItem1.fxml"));
loader.setController(this);
childHolder.getChildren().addAll(loader.load());

someChildTextField.setText("Some text");

someChildTextFieldaを指定しfx:id、次のように初期化の上に配置しました。

@FXML public TextField someChildTextField;

それでも、NullpointerException が発生するので、まだコントロールを見つけることができないと思います。

親コントローラーにロードされた FXML の要素にアクセスする方法を知っている人はいますか?

4

1 に答える 1

6

あなたのアプローチがうまくいかない理由はわかりません。私は似たようなものをモックアップしましたが、うまくいきました。ただし、2 つの別個の FXML ファイルのコントローラとして同じオブジェクトを使用しているため、これは通常とは異なるアプローチです。

FXML ごとに 1 つのコントローラーを使用することをお勧めします。だからあなたは次のようなことができます

public class SidebarItem1Controller {

    @FXML
    private TextField someTextField ;

    public void setText(String text) {
        someTextField.setText(text);
    }

}

そして、親コントローラーから行うだけです

FXMLLoader loader = new FXMLLoader(getClass().getResource("SidebarItem1.fxml"));
childHolder.getChildren().add(loader.load());
SideBarItem1Controller childController = loader.getController();
childController.setText("Some Text");

通常の方法で SideBarItem1.fxml ファイルにコントローラーを設定します。fx:controller = com.example.SidebarItem1Controller"

于 2014-12-12T14:58:18.107 に答える