2016-05-13 7 views
1

JavaFXに関しては新人ですが、最近私はかなり混乱している問題に直面しました。私はTabPaneを含むFXMLファイルを制御する "MainController"というクラスを使用しています。各タブは別のコントローラによって制御されます。しかし、タブを削除する必要がある状況があるので、MainControllerインスタンスにアクセスして、ペインから現在アクティブなタブを削除する必要があります。FXMLLoaderが実行中のコントローラインスタンスを見つけられず、新しいコントローラインスタンスを作成しました

このコードを使用して現在実行中のMainControllerのインスタンスを取得しているときは、コンポーネントのすべてをデフォルト値に設定して完全に新しいインスタンスを取得します。

コードは次のとおりです。

FXMLLoader loader = new FXMLLoader(getClass().getResource("Main.fxml")); 
loader.load(); 
MainController controller = loader.getController(); 
controller.closeCurrentTab(); 

protected void closeCurrentTab() { 
    tabPane.getTabs().remove(tabPane.getSelectionModel().getSelectedIndex()); 
} 

それは私の作品唯一のソリューションですので、私は現在、それをアクセスするために、コントローラへの静的参照を使用しています。しかし、私はこれは非常にプロフェッショナルではないことを知っていて、私は本当にそれを避けたい。

ここで何が間違っているのか誰かが知っていることを願っています。

答えて

1

メインコントローラのリファレンスを、使用したい場所に配置してください。私はそれが "子"コントローラ(おそらく現在のタブのコントローラ)の1つだと思います。

したがって、このクラスのメインコントローラのリファレンスを格納するプロパティを使用すると、問題は解決されます。あなたができるので、ここで

FXMLLoader loader = new FXMLLoader(getClass().getResource("TabController1.fxml")); 
loader.load(); 

mainControllerPropertyは次のように TabControllerで定義されている

TabController controller = loader.getController(); 
controller.mainControllerProperty.set(this); 

は、私はあなたのようなメインコントローラから、この "子" のコントローラを初期化すると思います

ObjectProperty<MainController> mainControllerProperty = new SimpleObjectProperty(); 
+0

ありがとうございます!これは私のタブではうまくいきました。 新しいウィンドウを作成しても同じことをしたい場合にのみ問題があります。コントローラにアクセスしようとすると、常にnullPointerExceptionが発生します。エラーが少し良くなると、私は新しい返信を追加します。 – Geta1992

+1

答えがあなたの問題を解決した場合、それを受け入れて投票できますか?これはこの質問を閉じます - あなたは別の問題の別の問題を作成することができます。これは疑問を明確にします。ありがとう:) – DVarga

+0

問題は、私はinitialize()メソッド内のコントローラにアクセスする必要があることが判明しますが、参照は後に追加することができるので、それはまだその時点でnullになります。 EDIT:それを自分で解決しました。ありがとう;) – Geta1992

関連する問題