Java 如何使用分离的fxml文件在初始化中加载控制器

Java 如何使用分离的fxml文件在初始化中加载控制器,java,javafx,Java,Javafx,我先创建了3个fxml文件,然后是预加载程序,然后是我的主应用程序。在预加载期间,我加载数据库内容、图像和一些其他任务 在预加载程序中,我创建了一个方法来加载我的主应用程序,如下所示 private void showMainProgram() throws IOException{ mainStage = new Stage(); FXMLLoader fxmlLoader = new FXMLLoader(); AnchorPane aplogin = fxmlL

我先创建了3个fxml文件,然后是预加载程序,然后是我的主应用程序。在预加载期间,我加载数据库内容、图像和一些其他任务

在预加载程序中,我创建了一个方法来加载我的主应用程序,如下所示

private void showMainProgram() throws IOException{


    mainStage = new Stage();
    FXMLLoader fxmlLoader = new FXMLLoader();
    AnchorPane aplogin = fxmlLoader.load(getClass().getResource("Main.fxml").openStream());
    MainController controller = (MainController) fxmlLoader.getController();

    controller.setLoaderProperties(this);

    Scene scene = new Scene (aplogin) ;
    mainStage.setScene(scene);
    mainStage.setTitle("loading");
    mainStage.show();


}  
现在发生的情况如下:

public class MainController implements Initializable {
public LoaderController loaderController ;

@FXML ListView mylist ;
@FXML Label labelName ;

/**
 * Initializes the controller class.
 */
@Override
public void initialize(URL url, ResourceBundle rb) {

    System.out.println("This will happen first (1)");


    DoSomeStuff();

}    

 public void DoSomeStuff () {

     System.out.println("This will happen next (2)");

     // now here i will get a javafx.fxml.LoadException 
     //because my loadController is not yet set

     labelName.setText(loaderController.UserDTO.getName());

 }

 public void setLoaderProperties(LoaderController loaderController) {

     // I need this to happen first 
     System.out.println("This happens last (3)");

    this.loaderController = loaderController ;


}
我试过这样的方法: 但我认为这创造了一个新的装载机控制器。所以我得到一个空异常

public void initialize(URL url, ResourceBundle rb) {


    try {

    FXMLLoader fxmlLoader = new FXMLLoader();
    VBox vboxLoader = fxmlLoader.load(getClass().getResource("loader.fxml").openStream());
    LoaderController loadcontroller = (LoaderController) fxmlLoader.getController();

    this.loaderController = loadcontroller;    





    } catch (IOException ex) {
        Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, null, ex);
    }

      DoSomeStuff();

}   
这解决了问题

public class MainController implements Initializable {
public LoaderController loaderController ;

@FXML ListView mylist ;
@FXML Label labelName ;

/**
 * Initializes the controller class.
 */
@Override
public void initialize(URL url, ResourceBundle rb) {

    System.out.println("This will happen first (1)");


}    

 public void DoSomeStuff () {

     System.out.println("This will happen last(3)");

     labelName.setText(loaderController.UserDTO.getName());

 }

 public void setLoaderProperties(LoaderController loaderController) {

     // I need this to happen first 
     System.out.println("This wil happen next (2)");

    this.loaderController = loaderController ;

    // adding DoSomeStuff in the method  setLoaderProperties  
    // fixed the problem     

    DoSomeStuff();


}

setLoaderProperties
的末尾调用
DoSomeStuff
。。谢谢你这么说。你不知道我在错误的方向上思考了多久@杰金你什么意思?我是否已经为每个FXML文件使用了不同的控制器?还是说在另一个控制器中使用该控制器?如果这不正确,我应该如何处理?你能举例说明你在说什么吗@詹姆斯·杜哈姆,是的,你是对的。不知何故,我完全误读了您的代码,并认为
LoaderController
引用了另一个实例。道歉。我将删除我的原始评论,因为它只会让人困惑(显然是胡说八道)。