initialize()在JavaFX中是如何工作的

initialize()在JavaFX中是如何工作的,java,javafx,fxml,Java,Javafx,Fxml,我有一部分代码,其中包含我在程序中使用的控制器的所有对象。topButtonsController是唯一一个从FXML文件(fx:include)注入的控件,其他控件由我自己创建 我确认,initialize()方法是在创建中的MainController构造函数后调用的,因此假设initialize()方法中的所有方法都应该首先完成它们的工作 public class MainController { @FXML private TopButtonsController topBu

我有一部分代码,其中包含我在程序中使用的控制器的所有对象。
topButtonsController
是唯一一个从FXML文件(fx:include)注入的控件,其他控件由我自己创建

我确认,
initialize()
方法是在创建中的MainController构造函数后调用的,因此假设
initialize()
方法中的所有方法都应该首先完成它们的工作

public class MainController {
   @FXML
   private TopButtonsController topButtonsController;

   private AddNewOrderController addNewOrderController = new AddNewOrderController();

   private OrdersController ordersController = new OrdersController();

   @FXML
   private BorderPane borderPane;

   @FXML
   public void initialize() {
       topButtonsController.setMainController(this);
       addNewOrderController.setMainController(this);
       ordersController.setMainController(this);
       System.out.println("Finished injection");    
   }
}
这里有一个用于另一个FXML文件的控制器类。按下按钮后,应调用
acceptButtonClicked
方法,但不幸的是
mainController
为空!如果我已经在MainController
initialize
method中将其设置为一个值,那么应该首先点击该值

public class AddNewOrderController {

   private MainController mainController;

   @FXML
   private TextField nameOfPizzaTextField;

   private ArrayList<Order> arrayList = new ArrayList<Order>();

   private ObservableList<Order> observableList = FXCollections.observableArrayList(arrayList);

   @FXML
   private Button acceptButton;
   @FXML
   void acceptButtonClicked(ActionEvent event) {
       if(mainController == null) {
           System.out.println("MainController is null!!"); //it is printed, why?
       }

       Order order = new Order(nameOfPizzaTextField.getText());
       arrayList.add(order);
       observableList.add(order);
       System.out.println("Dodano "+nameOfPizzaTextField.getText()+"do listy");
       System.out.println(observableList);
       mainController.getOrdersController().getListView().setItems(mainController.getAddNewOrderController().getObservableList()); // here occurs error

   @FXML
   public void initialize() {
   }

   public void setMainController(MainController mainController) {
       this.mainController= mainController;
   }
}
公共类AddNewOrderController{
专用主控制器;
@FXML
私有文本字段名称pIzzaTextField;
私有ArrayList ArrayList=新ArrayList();
私有ObservableList ObservableList=FXCollections.observableArrayList(arrayList);
@FXML
私人按钮接受按钮;
@FXML
作废acceptButtonClicked(ActionEvent事件){
if(mainController==null){
System.out.println(“MainController为null!!”;//它被打印了,为什么?
}
Order Order=新订单(nameOfPizzaTextField.getText());
arrayList.add(订单);
可观察列表添加(订单);
System.out.println(“Dodano”+nameOfPizzaTextField.getText()+“do listy”);
System.out.println(可观察列表);
mainController.getOrdersController().getListView().setItems(mainController.getAddNewOrderController().getObservableList());//此处发生错误
@FXML
公共无效初始化(){
}
公共无效setMainController(MainController MainController){
this.mainController=mainController;
}
}

acceptButtonClicked方法看起来像是在控制器上为FXML文件调用的处理程序方法。您正在手动创建的
AddNewOrderController
实例上调用
setMainController
:这不是控制器。您需要在加载相应FXML文件时实例化的实际控制器上调用
setMainController
。好的,我知道我不知道我得到的是哪个控制器。那么我如何才能获得正确的控制器。是否由FXMLLoader类?FXMLLoader=FXMLLoader(…);loader.getController()?加载(并显示)FXML文件时,必须获取控制器。(在调用
load()
后调用
getController()
)。我仍然无法获取它。如果这样做,我会让其他控制器知道还有其他控制器(因为我需要在其他文件中创建此类字段)例如,我在TopMenuButtonController中加载所有fxml文件,因此我需要创建3个附加字段,其中包含控制器实例,以及如何将其传递到另一个文件?我只想让mainController知道存在更多控制器。您是否有任何现成的应用程序或示例强调问题?我真的不明白您是如何尝试解决这个问题的组织应用程序。如果您的
TopMenuButtonController
正在加载FXML文件,它需要在相应的控制器上执行任何必要的初始化。FXML文件和控制器作为一对非常紧密的耦合对工作:如果
TopMenuButtonController
正在加载FXML文件,那么它实际上已经隐含了它也在创建控制器。