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
为空!如果我已经在MainControllerinitialize
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文件,那么它实际上已经隐含了它也在创建控制器。