2016-01-22 25 views
1

我用幾個場景,目前有針對每個場景一個方法,像如何獲取JavaFx8中的場景控制器?

void setScene1() { 
    FXMLLoader loader = new FXMLLoader(getClass().getResource("/main2.fxml")); 
    Parent root = FXMLLoader.load(); 
    Scene scene = new Scene(root); 
    loader.getController<Controller1>().callMethod(); 
    primaryStage.setScene(scene); 

    } 

,但我想記住的場景和那樣做

void setScene1() { 
    FXMLLoader loader = scene1.getLoaderSomehow(); // < ---- ???? 
    loader.getController<Controller1>().callMethod(); 
    primaryStage.setScene(scene1); 

    } 
+1

海事組織,你只是想保持每個控制器的參考調用一個方法? – Kwoinkwoin

回答

4

這可以通過使用Scene.getUserData and Scene.setUserData來完成:

... 
Scene scene = new Scene(root); 
scene.setUserData(loader); 
FXMLLoader loader = (FXMLLoader) scene.getUserData(); 

但是您應該記住以下內容:

  • 您只使用加載程序來獲取控制器。加載器可能包含對可能被垃圾回收的對象的引用。考慮保留對控制器的引用。
  • 任何其他地方會更方便(並取決於更安全的方法)。你是「記住」Scene,那爲什麼不是「記住」的裝載機/控制器呢?
0

爲了讓事情更有條理,您可以創建一個包含所有必需的對象在一起,一個新的類:

// application screen i.e. view, "page" 
public class AppScreen 
{ 
    private String fxmlPath; 
    private javafx.scene.Scene scene; 
    private RootController rootController; 

    // Getters, setters 
} 

// Collection to store loaded app screens, uses fxml path text as a key 
private final Map<String, AppScreen> appScreens = new HashMap<>(); 

// load the fxml if it is not loaded previously or use already loaded one 
void loadAppScreen(String fxmlPath) throws IOException 
{ 
    AppScreen appScreen; 
    if (appScreens.containsKey(fxmlPath)) 
    { 
     appScreen = appScreens.get(fxmlPath); 
    } 
    else 
    { 
     FXMLLoader loader = new FXMLLoader(getClass().getResource(fxmlPath)); 
     Parent root = loader.load(); 
     Scene scene = new Scene(root); 
     RootController rc = loader.<RootController>getController(); 

     appScreen = new AppScreen(); 
     appScreen.setFxmlPath(fxmlPath); 
     appScreen.setScene(scene); 
     appScreen.setRootController(rc); 

     appScreens.put(fxmlPath, appScreen); 
    } 

    appScreen.getRootController().refreshData(); 
    primaryStage.setScene(appScreen.getScene()); 
} 
相關問題