2017-04-24 37 views
0

我有一個HierarchyTabController,我在應用程序的初始加載時調用此方法一次。一旦新數據添加到另一個控制器中,如何更新控制器?

public void displayRootTreeStructure() 
{ 
    //for loops through each Requirement to display all RequirementGroups 
} 

的問題是,我有稱爲RequirementGroupsController另一個控制器,其有一個方法,則用戶可以與一個按鈕的點擊添加。

@FXML 
    private void addRequirementGroup() 
    { 
    } 

因此,換句話說,如果用戶增加了一個需求組,然後切換到所述層級標籤,它是過時的。如何在用戶調用addRequirementGroup時調用displayRootTreeStructure方法?

+0

聽起來你需要一個模型類,並且需要與每個控制器共享該類的一個實例。然後,控制器可以觀察模型並在數據更改時根據需要更新UI。 (這是類似於MVC的設計模式的本質。)請查看http://stackoverflow.com/questions/32342864/applying-mvc-with-javafx獲取模式的示例。 –

+0

問題是,只有一個控制器正在修改數據。另一個控制器只是顯示數據。 – Jay266

+0

沒錯。在兩個控制器之間共享模型實例。顯示數據的控制器可以觀察模型中的數據並根據需要更新UI。修改數據的控制器將修改這些數據,然後另一個控制器將自動更新它。樹的模型可能會更復雜,因爲示例中的簡單模型鏈接在一起,但結構思想是相同的。 –

回答

0

。假定這兩種方法在不同的類(未指定):

傳遞給addRequirementGroup類displayRootTreeStructure類的參考。

DisplayRootTreeStructureClass ref = YOUR_REFERENCE_TO_THE_OBJECT; 
@FXML 
    private void addRequirementGroup() 
    { 
    ref.displayRootTreeStructure(); 
    } 

或者,您可以使displayRootTreeStructure靜態並直接從類訪問它。但是,正如James_D所說的那樣,請注意採取這條路線時可能出現的複雜情況。

public class DisplayRootTreeStructureClass{ 

    public static void displayRootTreeStructure(){ 
    //do stuff 
    } 
} 

,你會從類名直接調用訪問它,沒有對象需要:

@FXML 
    private void addRequirementGroup() 
    { 
    DisplayRootTreeStructureClass.displayRootTreeStructure(); 
    } 

你應該儘量讓更多的細節您的問題。它使得完全回答你的問題變得更容易。在撰寫本文時,我甚至不知道這是否正確,因爲您沒有提供足夠的細節。

+0

不要使該方法爲靜態。如果你想在同一個應用程序中顯示兩棵這樣的樹呢? (如果您的老闆要求您在6個月內添加該功能,該怎麼辦:如果您已使該方法處於靜態狀態,則必須重新編寫應用程序的潛在大塊以適應新功能。) –

+0

「請注意併發症。 「。啊,不要這樣做。 'static'關鍵字是關於作用域的,關於一個方法是否應該是靜態的決定應該根據合適的作用域來決定。此方法正在修改某些屬於此類的特定*實例*的屬性:與特定視圖關聯的控制器對象。它顯然不是整個類的屬性,而是控制器實例的屬性。使這種方法'靜態'是明顯錯誤的。 –

相關問題