2013-07-28 76 views
3

我已经创建了一个根的FXML这是一个BorderPane,它有他自己的根控制器。 我想动态地将FXML添加到此边框的中心。JavaFX多FXML和1个共享控制器

每个这些FXML的共享相同的控制器,根控制器。我在netbeans中通过在创建一个空的FXML文件时选择一个exsisting控制器来完成此操作。

我也给了不同的节点ID名称,但根本控制器不会在这些FXML的识别节点。

是否有可能分享不同的FXML的同一控制器?

在此先感谢

回答

8

背景

我不知道,共享控制器实例实在是推荐,至少我从来没有见过它之前完成。

即使您在每个fxml中设置了控制器类,但您将加载到相同的值,但它不会共享相同的控制器实例,因为每次加载控制器时,都会创建一个新实例(对象)的控制器类(这似乎不是你想要的)。

可能的解决方案

我还没有尝试过这两种解决方案,但相信他们会工作。

初始化方法很可能会在每次加载新FXML文件调用。所以你会想通过初始化idempotent来解释你的逻辑。

A.手动设置控制器实例。

  1. 从fxml文件中删除所有对控制器类的引用。
  2. 手动创建控制器类的实例。

    MyController controller = new MyController(); 
    
  3. 在加载每个fxml之前,将控制器设置为您的控制器实例。

    FXMLLoader loader = new FXMLLoader(); 
    loader.setController(controller); 
    Panel panel = (Panel) loader.load("myfxml.fxml"); 
    
  4. 对每个fxml文件重复步骤3,每次使用相同的控制器参考。

B.使用一个控制器工厂。

您可以在您的fxml加载器上使用set a controller factory,并让控制器工厂始终返回相同的控制器实例。

+0

谢谢你,你的信息真的很有帮助 – user1786646