2016-07-13 12 views
0

私はJavaFXを使用するのに非常に新しく、FXMLでJavaFXを使用する際にいくつか問題があります。私は、クリックすると(Arduinoへの)接続で新しいウィンドウを開く "Setup"ボタンでプログラムを作成しています。メニューには、ボードに接続する別のボタン(「接続」)があります。これでウィンドウが閉じます。私はこの変更を元の "setup"ボタンのテキストを "disconnect"に変更したいと思っていますが、私は "setup window"からボタンにアクセスできないようです。たび私は、私は次のエラーを取得する「接続」をクリックします:ボタン内のテキストを別のウィンドウ(JavaFX + FXML)からどのように変更しますか?

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 

私は、これはnullポインタ例外のラッパーであることをオンラインで読みます。私は、 "セットアップ"ボタンがnullであると仮定し、それを変更することはできませんが、私はなぜそれを解決することはできません。ここで

はMainController.javaからの抜粋です。

@FXML 
    protected void setUpConnection(ActionEvent e) { 
     SetupController setupController = new SetupController(); 
     setupController.init(this); 
    } 

「設定」ボタンをクリックすると、上記の方法は、(ファイル内のセット:setupMenu.fxml)呼び出されます。これにより、別のウィンドウが開きます。ここでは、ウィンドウを開きますSetupController.javaでコードされています

private void openSetupWindow() { 
    try { 
     FXMLLoader loader = new FXMLLoader(getClass().getResource("setupMenu.fxml")); 
     Parent root1 = (Parent)loader.load(); 
     Stage stage = new Stage(); 

     stage.setTitle("Setup Connection"); 
     stage.setScene(new Scene(root1)); 
     stage.show(); 
    } catch(Exception exc) { 
     exc.printStackTrace(); 
    } 
} 

接続ボタンをクリックすると、(SetupController.javaで)以下のメソッドが呼び出されます。

private void changeButtonText(ConnectionEventType e) { 
     Button b = main.getSetupButton(); 

     if(e == ConnectionEventType.CONNECT) { 
     b.setText("Disconnect"); 
     } 
     else { 
     b.setText("Setup Connection..."); 
     } 
    } 

(メインがありますsetupController.init()に渡されたMainControllerオブジェクト 上記のコードは、エラーが発生している場所です。 私は2つの別々のfxmlファイルを持っています.1つはメインウィンドウ用、もう1つはポップアップ用です。 sample.fxml(メインウィンドウ)は、そのコントローラーはメインコントローラに設定されている(下記)Main.javaに設定されている:

@Override 
    public void start(Stage primaryStage) throws Exception{ 
     try { 
     FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml")); 

     GridPane root = loader.load(); 

     Scene scene = new Scene(root, 1200, 900); 
     scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 

     primaryStage.setTitle("Nest Control"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
    } 

は私が間違ってボタンにアクセスしようとしていますか?誰でも手伝ってくれますか?私が言ったように、私はJavaFXやFXMLの使用経験はあまりありません。

答えて

0

あなたが探している答えは、あなたがコントローラ内の変数にアクセスできるようにあなたが開いている各ウィンドウのコントローラを保存することだと思います。しかし、コードの残りの部分はあなたに助言するのは難しいでしょうが、

private SetupController yourController; 

@Override 
public void start(Stage primaryStage) throws Exception{ 
try { 
FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml")); 
GridPane root = loader.load(); 
this.yourController=loader.<SetupController>getController(); 
Scene scene = new Scene(root, 1200, 900); 
} 
} 

あなたは、モデル - ビュー - コントローラタイプの方法で、他のインスタンスに変数yourControllerを渡し、そのメソッドにアクセスすることができます:私が何を意味するかの。

またはあなたのケースでは、このような何か:

private void changeButtonText(ConnectionEventType e) { 
     Button b = this.yourController.getButton(); //a method that returns your @FXML button object in your controller 

     if(e == ConnectionEventType.CONNECT) { 
     b.setText("Disconnect"); 
     } 
     else { 
     b.setText("Setup Connection..."); 
     } 
    } 

または代わりにボタンオブジェクトを返すことなく、ボタンのテキストを設定しますコントローラー内の特定のメソッドを持っています。

例を参照してくださいherehere

は、しかし、あなたが得るエラーはので、多分あなたはまた、任意のコントローラ内のすべての変数を注釈を付けていることが、この例で確認してください一般的に不足している@FXML注釈に起因しているようですのでご注意下さい。詳細はhereを参照してください。

+0

ありがとうございます。私は私の質問がちょっと長くて複雑であることを理解しています。私があなたが示唆したものと遊んだ後、私は更新します。再度、感謝します – liamw9

関連する問題