2016-07-06 60 views
0

我有一個通過FXML聲明的TabPane。我正在嘗試動態添加新選項卡。使用自己的FXML創建新選項卡

我創建了一個單獨的類對那些標籤:

public class DetailTab extends Tab { 

我Controller.java正在產生新的DetailTabs並將它們添加到我的TabPane:

detailsPane.getTabs().add(new DetailTab(title)); 

內DetailTab.java,我我試圖用不同的FXML文件填充新選項卡的內容,具體取決於傳遞給DetailTab構造函數的String。

try { 
       System.out.println("Trying fxml"); 
       this.setContent(FXMLLoader.load(getClass().getResource("tabUserComments.fxml"))); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

這將創建一個NullPointerException。 tabUserComments.fxml文件與DetailTab.java一起位於項目的根目錄中。

IntelliJ project structure

什麼是做到這一點的最好方法是什麼?我甚至可以將內容從DetailTab本身內容設置爲FXML文件?如果可能的話,我想避免使用Controller來設置選項卡的內容。

+0

你似乎想要部分視圖,我不認爲javafx支持,除了當你加載不同的fxml文件與相同的後備控制器,控制器的新實例將被創建,他們將不會共享相同的實例/狀態 – niceman

+0

如果需要,我很高興爲每個單獨的選項卡的fxml創建單獨的控制器。如果我將其他控制器分配給tabUserComments.fxml,我注意到異常會被清除。 但是,現在我看到該選項卡仍未填充新的fxml數據。 – Zephyr

+0

那麼有沒有更好的方法來填充一個單獨的fxml文件的選項卡?我計劃有很多標籤,並且希望單獨設計它們,而不是用每個代碼的所有不同代碼來膨脹我的DetailTab類。 – Zephyr

回答

0

我能夠用我的DetailsTab.java類中下面的代碼來獲得部分解決:

try { 
       FXMLLoader loader = new FXMLLoader(getClass().getResource("tabUserComments.fxml")); 
       loader.setController(this); 
       this.setContent(loader.load()); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

這仍然是造成我無法訪問包含在tabUserComments的控制數據的問題。 FXML。然而,我會將此標記爲已回答,因爲數據的傳遞完全是另一個問題;這確實允許爲每個選項卡設計單獨的FXML文件。

+0

'loader.setController(this);'搞亂控制和控制器是一種難聞的氣味imho – whitesite

相關問題