2016-07-13 6 views
0

Ich bin sehr neu in der Verwendung von JavaFX und habe einige Probleme mit JavaFX mit FXML. Ich erstelle ein Programm mit einer "Setup" -Schaltfläche, die beim Klicken öffnet ein neues Fenster mit den Einstellungen für die Verbindung (zu einem Arduino). Auf dem Menü befindet sich eine weitere Schaltfläche ("Connect"), die mit der Karte verbunden ist. Dies schließt das Fenster. Ich suche den Text der ursprünglichen "Setup" -Schaltfläche auf "disconnect" zu setzen, allerdings scheint es mir nicht möglich zu sein, auf die Schaltfläche aus dem "Setup-Fenster" zuzugreifen. Jedes Mal, wenn ich auf „connect“ Ich erhalte die folgenden Fehler:Wie ändern Sie den Text in einer Schaltfläche aus einem anderen Fenster (JavaFX + FXML)?

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

ich online gelesen, dass dies ein Wrapper für eine Null-Zeiger-Ausnahme. Ich gehe davon aus, dass der "Setup" -Button null ist und deshalb kann ich ihn nicht ändern, aber ich kann nicht herausfinden warum. Hier

ist ein Auszug aus MainController.java:

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

Die obige Methode aufgerufen wird, wenn die Taste "Setup" (Einstellung in der Datei: setupMenu.fxml) geklickt wird. Dies öffnet dann das separate Fenster. Hier ist der Code in SetupController.java, die das Fenster öffnet sich:

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(); 
    } 
} 

Wenn die Verbindungstaste angeklickt wird, wird das folgende Verfahren (in SetupController.java) aufgerufen wird:

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

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

(Haupt das ist MainController-Objekt, das an setupController.init() übergeben wurde Der obige Code ist, wo ich den Fehler erhalte. Nur um zu verdeutlichen, habe ich 2 separate fxml-Dateien, eine für das Hauptfenster und eine für das Pop-up. sample.fxml (das Hauptfenster) hat seine Controller MainController gesetzt und wird in Main.java (unten) ein:

@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(); 
     } 
    } 

Versuche ich falsch auf die Schaltfläche zugreifen? Kann jemand helfen? Wie gesagt, ich habe nicht viel Erfahrung mit JavaFX oder FXML.

Antwort

0

Ich denke, die Antwort, die Sie suchen, ist die Controller für jedes Fenster zu speichern, die Sie öffnen, so dass Sie auf die Variablen innerhalb der Controller zugreifen können, ohne den Rest Ihres Codes schwer zu beraten wäre, aber ein Beispiel von dem, was ich meine:

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); 
} 
} 

Sie könnten dann die Variable yourController auf andere Instanzen in einem Model-view-Controller-Typ Art und Weise passieren und seine Methoden zugreifen.

oder so etwas wie dies in Ihrem Fall:

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..."); 
     } 
    } 

oder alternativ ein spezielles Verfahren in der Steuerung, die den Text der Taste eingestellt werden, ohne dass die Schaltfläche Objekt zurückkehren zu müssen.

die Beispiele Siehe here und here

Bitte beachten Sie jedoch die Fehler Sie fehlende @FXML Anmerkungen der Regel erhalten zurückzuführen vielleicht so sicherstellen, dass auch in diesem Fall, dass Sie mit Anmerkungen versehen haben alle Variablen in allen Controllern scheint. Weitere Details finden Sie unter here.

+0

Danke dafür. Ich verstehe, dass meine Frage ein bisschen lang und kompliziert war. Ich werde aktualisieren, sobald ich mit dem, was Sie vorgeschlagen haben, gespielt habe. Danke noch einmal – liamw9