【问题标题】:How to get controller of scene in JavaFx8?如何在 JavaFx 8 中获取场景控制器?
【发布时间】:2016-01-22 07:39:25
【问题描述】:

我使用了几个场景,目前每个场景都有一种方法,比如

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

  }

但我想记住场景并这样做

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

  }

【问题讨论】:

  • imo,你只是想保留每个控制器的引用来调用方法吗?

标签: javafx javafx-8


【解决方案1】:

这可以使用Scene.getUserData and Scene.setUserData

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

但你应该记住以下几点:

  • 您仅使用加载程序来获取控制器。加载器可能包含对可能被垃圾回收的对象的引用。考虑改为保留对控制器的引用。
  • 任何其他地方都会更方便(并且取决于类型更安全的方法)。您正在“记住”Scene,那么为什么不“记住”加载器/控制器呢?

【讨论】:

    【解决方案2】:

    为了让事情更有条理,您可以创建一个包含所有必要对象的新类:

    // 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() );
    }
    

    【讨论】:

      猜你喜欢
      • 2014-11-21
      • 2014-11-02
      • 2012-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多