初始化主函数中的三个控制器类时,JavaFX中出现NullPointerException
在主类中初始化FXML时,我在JavaFX中得到一个NullPointerException 我在每个控制器类中调用主函数initprogram(),并计算调用次数初始化主函数中的三个控制器类时,JavaFX中出现NullPointerException,exception,javafx,controller,initializing,Exception,Javafx,Controller,Initializing,在主类中初始化FXML时,我在JavaFX中得到一个NullPointerException 我在每个控制器类中调用主函数initprogram(),并计算调用次数 @Override public void initialize(URL url, ResourceBundle rb) { Main.initProgramm(); } 主类 public class Main extends Application { public static Stage stage;
@Override
public void initialize(URL url, ResourceBundle rb) {
Main.initProgramm();
}
主类
public class Main extends Application {
public static Stage stage;
public static String language;
public static ControllerMain controllerMain;
public static ControllerTabManual controllerTabManual;
public static ControllerTabCode controllerTabCode;
private static int countInits=0;
@Override
public void start(Stage stage) throws Exception {
try( Scanner file = new Scanner(new FileInputStream(new File("res/settings/language.txt")), StandardCharsets.UTF_8.name()) ) {
language = file.nextLine().trim();
}
catch(Exception e){}
FXMLLoader loader = new FXMLLoader(getClass().getResource("fxml/Main.fxml"));
Parent root = (Parent) loader.load();
controllerMain = (ControllerMain) loader.getController();
controllerTabManual = (ControllerTabManual) loader.getController();
controllerTabCode = (ControllerTabCode) loader.getController();
Scene scene = new Scene(root);
scene.getStylesheets().add(getClass().getResource("css/default.css").toExternalForm());
stage.getIcons().addAll(
new Image(getClass().getResourceAsStream("img/app_icon64x64.png")),
new Image(getClass().getResourceAsStream("img/app_icon32x32.png")),
new Image(getClass().getResourceAsStream("img/app_icon16x16.png"))
);
stage.setTitle("stepControl");
stage.setScene(scene);
stage.setOnCloseRequest(e -> {
e.consume();
closeProgramm();
}
);
stage.show();
Main.stage = stage;
}
public static void initProgramm() {
countInits++;
if( countInits==3 )
{
if( Main.language.equals("de") )
controllerMain.menuLanguageOne.setDisable(true); // LINE 71
else if( Main.language.equals("en") )
controllerMain.menuLanguageTwo.setDisable(true);
controllerMain.grblSender = new GrblSender();
controllerMain.grblSender.setPorts(controllerTabManual.comboBoxSelectPort, true);
}
}
public static void main(String[] args) {
launch(args);
}
}
最后一个错误:
Caused by: java.lang.NullPointerException
at de.emericon.stepcontrol.Main.initProgramm(Main.java:71)
at de.emericon.stepcontrol.ControllerMain.initialize(ControllerMain.java:55)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
... 12 more
Exception running application de.emericon.stepcontrol.Main
我认为异常的根本原因是控制器类的引用
public static ControllerMain controllerMain;
public static ControllerTabManual controllerTabManual;
public static ControllerTabCode controllerTabCode;
这将调用控制器的initialize
方法(ControllerMain
)
在这个方法中,您可以调用initProgramm
。在这个方法中,您可以调用controllerMain.menuLanguageOne.setDisable(true);//第71行
所以这里你要用controllerMain。但是
controllerMain = (ControllerMain) loader.getController();
controllerMain变量在此处获取值。但此时未到达中的这一行,因为它位于Parent root=(Parent)loader.load()之后代码>行
因此,您有一个很好的NullPointerException
但是,请阅读我对OP的评论。首先:一个FXML文件应该有一个控制器。FXML加载器将创建您在FXML文件中引用的控制器。一个控制器,一种类型。因此,不可能解析为3种不同的类型。此外,这也没有任何意义。再加上@DVarga的评论:你在这里到底想做什么真的很不清楚。为什么有三种不同的控制器类?你到底期望这能做什么?为什么不把initprogram
方法中的代码放到控制器的initialize()
方法中呢?
controllerMain = (ControllerMain) loader.getController();