2016-07-13 44 views
0

我對使用JavaFX非常陌生,在使用JavaFX和FXML時遇到了一些麻煩。我正在創建一個帶有「設置」按鈕的程序,單擊它時會打開一個帶有連接(到Arduino)設置的新窗口。在菜單上是另一個連接到電路板的按鈕(「連接」)。這關閉了窗口。我期待這個改變原來的「設置」按鈕的文本「斷開」,但是,我似乎無法從「設置窗口」訪問按鈕。每當我點擊「連接」,我得到以下錯誤:如何從另一個窗口(JavaFX + FXML)更改按鈕中的文本?

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

我在線閱讀,這是一個空指針異常的包裝。我認爲「設置」按鈕是空的,這就是爲什麼我不能改變它,但我不知道爲什麼。

下面是從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文件,一個用於主窗口,一個用於彈出。 sample.fxml(主窗口)有其控制器設置爲MainController和設在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

相關問題