2017-12-14 21 views
1

私は、SQL DBを保存/読み込みするか、XMLから読み書きするかを選択できるプログラムを開発する必要のあるプロジェクトを学校に持っています。JavaFX FXMLLoader getController NullPointerException

私はどちらの方法でも選択できるGUIを作っています。

ユーザーがいずれかのボタンをクリックするとGUIが閉じ、MainMenu GUIが開きます。 今私はMainMenuControllerでユーザーが何を選択するかを知る必要があります。 FXMLLoader.getController()で、最初のコントローラの中でMainMenuControllerを呼び出す方法をオンラインで見つけました。

try {      
    Stage stage = new Stage(); 
    FXMLLoader Loader = new FXMLLoader(); 
    Parent root = Loader.load(getClass().getResource("MainMenu.fxml")); 

    MainMenuController mc = Loader.getController(); 
    mc.setSave("sql"); 

    Scene scene = new Scene(root); 
    stage.setScene(scene); 
    stage.show(); 
} 
catch (Exception e) { 
    e.printStackTrace(); 
} 

MainMenuController

public class MainMenuController { 
    private String save = null; 

    public void setSave(String save) { 
     this.save=save; 
    } 
    public String getSave() { 
     return save; 
    } 
} 

しかし、私は、私はあなたが静的メソッドFXMLLoader.load(URL)を呼び出している

mc.setSave("sql") 

答えて

0

まず、この問題を理解するために、あなたはあなたのproblem.Whenがどこにあるかを検出するためにいくつかのトリックを行う必要がありますあなたの操作を行います。

System.out.println(mc); 

あなたは結果があなたがnull OBJとsetSave("sql")を呼び出すことはできません。だからnullがわかりますあなたのファイルの場所が指定されていないため、あなたはnullコントローラを手に入れましたが、問題を解決するためにいくつかの行を変更することができます:

try { 
      Stage stage = new Stage(); 
      FXMLLoader fxm = new FXMLLoader(getClass().getResource("MainMenu.fxml")); 

      Parent parent = (Parent) fxm.load(); 
      Scene scene = new Scene(parent); 
      stage.setScene(scene); 
      stage.show(); 
      FirstController mc = fxm.getController(); 
      System.out.println(mc); 
      mc.setSave("sql"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
+1

ありがとうございました。 :) – bad

1

ためNullPointerExceptionを取得MainMenuControllerのメソッドにアクセスしようとします。これは静的メソッドなので、作成したFXMLLoaderインスタンスの状態には影響しません。具体的にはコントローラフィールドは設定されていません。

は代わりに、FXMLLoaderインスタンス上の場所を設定し、インスタンス方法load()呼び出し:

FXMLLoader loader = new FXMLLoader(); 
loader.setLocation(getClass().getResource("MainMenu.fxml")); 
// or just FXMLLoader loader = new FXMLLoader(getClass().getResource("MainMenu.fxml")); 

Parent root = loader.load(); 
+0

ありがとう。今それはちょうど完璧に動作します:) – bad

関連する問題