2016-11-28 6 views
0

私は学校プロジェクト用のアプリケーションを作成しました。ログイン後、ダッシュボードにアクセスしてください。それは動作しますが、ボタンを無効にするように設定しようとするとNullPointerExceptionがスローされます。このファイルにはJavaFX NullPointerException他のクラスのボタン

、ステージは(ログイン後)に変化している:

public class ScreenController { 
    public void setScene(Stage stage, Parent root,Button button, String file){ 
     if(file == "dashboard"){ 
      stage = (Stage) button.getScene().getWindow(); 
      try { 
       root = FXMLLoader.load(getClass().getResource("Dashboard.fxml")); 
      } catch (IOException ex) { 
       System.out.println("IOException: "+ex); 
      } 
      Scene scene = new Scene(root); 
      stage.setTitle("Corendon - Dashboard"); 
      stage.setScene(scene); 

      stage.show(); 
      Dashboard dashboard = new Dashboard(); 
     } 
    } 
} 

そして、最後の行に、ボタンが無効に設定する必要があります...

Dashboard dashboard = new Dashboard(); 

.. 。このクラスによって:

public class Dashboard extends ScreenController { 
    @FXML public Button buttonDashboard1; 

    public Dashboard(){ 
     buttonDashboard1.setDisable(true); 
    } 
} 

しかし、それはそれを動作していないとNullPointerExceptionがスローされます。

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774) 
    at 
... 
Caused by: java.lang.NullPointerException 
    at fastenyourseatbelts.Dashboard.<init>(Dashboard.java:11) 
    at fastenyourseatbelts.ScreenController.setScene(ScreenController.java:33) 
    at fastenyourseatbelts.LoginController.buttonLogin(LoginController.java:74) 
    ... 59 more 

私は今何時間も努力していますが、私は解決策を得ていません...何が間違っているのか、誰に分かりますか?

答えて

0

コントローラのコンストラクタのコードをinitializeに移動します。この方法は、すべてのフィールドの注入が完了した後、FXMLLoaderによって呼び出されるため、buttonDashboard1インスタンスへのアクセスが必要です:また、コントローラは、FXMLのルート要素で指定されるかを確認する必要があり

public class Dashboard extends ScreenController { 
    @FXML public Button buttonDashboard1; 

    @FXML 
    private void initialize() { 
     buttonDashboard1.setDisable(true); 
    } 
} 

をファイルそれをロードする前に

<VBox xmlns:fx="http://javafx.com/fxml/1" fx:controller="packagename.Dashboard"> 
    <children> 
     <Button text="click me" fx:id="buttonDashboard1"/> 
    </children> 
</VBox> 

またはFXMLのためのコントローラとして設定し(Dashboardクラスのパッケージにpackagenameを置き換える):

FXMLLoader loader = new FXMLLoader(getClass().getResource("Dashboard.fxml")); 
Dashboard dashboard = new Dashboard(); 
loader.setController(dashboard); 
root = loader.load(); 

(この場合はfx:controller属性を使用しないでください)

+0

素晴らしい、トリックをやった!助けてくれてありがとう、ファビアン!私はプロジェクトを続けることができます:) –

関連する問題