2016-04-12 6 views
-1

メインクラスで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

まず、1つのFXMLファイルに1つのコントローラが必要です。 FXMLローダーは、FXMLファイルで参照しているコントローラーを作成します。 1つのコントローラ、1つのタイプ。したがって、3つの異なるタイプに解析することは不可能です。また、それは意味をなさない。 – DVarga

+1

@ DVargaのコメントに追加するには、あなたがここで何をしようとしているのかは本当に不明です。なぜ3つの異なるコントローラクラスがありますか?これが実際に何を期待していますか? 'initProgramm'メソッドのコードをコントローラの' initialize() 'メソッドに入れてみてください。 –

答えて

0
Parent root = (Parent) loader.load(); 

これはあなたのコントローラ(ControllerMain)のinitializeメソッドを呼び出します。

このメソッドでは、initProgrammを呼び出します。この方法ではcontrollerMain.menuLanguageOne.setDisable(true); // LINE 71と呼んでいます。

ここで、controllerMainを使用します。しかし!

controllerMain = (ControllerMain) loader.getController(); 

controllerMain変数はここで値を取得します。しかし、この時点で到達していないこの行は、Parent root = (Parent) loader.load();行の後にあるためです。

したがって、素晴らしいNullPointerExceptionがあります。

しかし、OPに関する私のコメントを読んでください。

関連する問題