2016-05-13 100 views
1

對於JavaFX,我是一個新手,最近我遇到了一個讓我非常困惑的問題。我使用一個名爲「MainController」的類來控制包含TabPane的FXML文件。每個選項卡由另一個控制器控制。但是有一種情況需要刪除標籤,所以我需要訪問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

你應該確保在你想使用它的地方有一個你的主控制器的參考。我想這是「孩子」控制器之一(很可能是當前選項卡的控制器)。

因此,如果您在此類中有一個存儲主控制器參考的屬性,則問題將得到解決。

我猜你喜歡的主控制器初始化這個 「孩子」 控制器:

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

所以在這裏你可以這樣做:

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

mainControllerPropertyTabController定義如下:

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

非常感謝!這對我的標籤非常有用。 我只是有一個問題,如果我想創建一個新的窗口時做同樣的事情。試圖訪問控制器總是會導致nullPointerException。一旦我明白這個錯誤會更好一點,我會添加一個新的回覆。 – Geta1992

+1

如果答案解決了你的問題,你能接受並投票嗎?這將關閉這個問題 - 那麼你可以爲另一個問題創建另一個問題。這使問題清楚。謝謝:) – DVarga

+0

原來的問題是我需要訪問initialize()方法中的控制器,但它仍然是空的,因爲只能在此之後添加引用。 編輯:解決那個我自己。謝謝 ;) – Geta1992