繁体   English   中英

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

[英]How to load controller in initialize using separated fxml files

我先创建了3个fxml文件,然后登录了preloader和我的主应用程序。 在预加载器中,我加载数据库内容和图像以及其他一些任务。

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

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


}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM