Java 如何使用分离的fxml文件在初始化中加载控制器
我先创建了3个fxml文件,然后是预加载程序,然后是我的主应用程序。在预加载期间,我加载数据库内容、图像和一些其他任务 在预加载程序中,我创建了一个方法来加载我的主应用程序,如下所示Java 如何使用分离的fxml文件在初始化中加载控制器,java,javafx,Java,Javafx,我先创建了3个fxml文件,然后是预加载程序,然后是我的主应用程序。在预加载期间,我加载数据库内容、图像和一些其他任务 在预加载程序中,我创建了一个方法来加载我的主应用程序,如下所示 private void showMainProgram() throws IOException{ mainStage = new Stage(); FXMLLoader fxmlLoader = new FXMLLoader(); AnchorPane aplogin = fxmlL
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
引用了另一个实例。道歉。我将删除我的原始评论,因为它只会让人困惑(显然是胡说八道)。