我對使用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的經驗。
感謝您的。我明白我的問題有點冗長和令人費解。一旦我玩了你的建議,我會更新。再次感謝 – liamw9