メインクラスでFXMLを初期化するときにJavaFXでNullPointerExceptionが発生します。メイン関数の3つのコントローラクラスを初期化しているときにJavaFXのNullPointerExceptionが発生する
私はすべてのコントローラクラスをメイン関数initProgramm()を呼び出し、呼び出しを数えます。
@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;
まず、1つのFXMLファイルに1つのコントローラが必要です。 FXMLローダーは、FXMLファイルで参照しているコントローラーを作成します。 1つのコントローラ、1つのタイプ。したがって、3つの異なるタイプに解析することは不可能です。また、それは意味をなさない。 – DVarga
@ DVargaのコメントに追加するには、あなたがここで何をしようとしているのかは本当に不明です。なぜ3つの異なるコントローラクラスがありますか?これが実際に何を期待していますか? 'initProgramm'メソッドのコードをコントローラの' initialize() 'メソッドに入れてみてください。 –