2016-11-20 7 views
0

Ich habe eine Utility Klasse, in der ich versuche, eine static Methode namens switchScene zu schaffen, in der Lage, Szenen in meinem Stadium leicht zu wechseln. Dies ist der Code, den ich zu verwenden versucht:JavaFX Problem mit Switching Szene

public class Utility { 
    public static void switchScene(String path) { 
     Stage stage = getMainStage(); // Assume this returns the primary stage 
     FXMLLoader loader = new FXMLLoader(); 
     loader.setLocation(getClass().getResource(path)); 

     try { 
      Parent root = loader.load(); 
      Controller controller = loader.getController(); 
      controller.start(); 
      Scene scene = new Scene(root); 
      stage.setScene(scene); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

ich diesen Code dachte funktionieren würde (. Ich bin jeden Controller für meine Ansicht implementieren die Controller Schnittstelle zu machen, die nur ein start Verfahren auf sie hat), aber ich Diese Fehlermeldung:

java: non-static method getClass() cannot be referenced from a static context 

Gibt es etwas, was ich tun kann, um dies zu umgehen?

Antwort

1

nicht Pfad als bekommen String. Ändern Sie ihn auf URL

Jetzt jeder es mit ihren eigenen fxml nennen können, wo immer kann es sein, und die Signatur ist weniger verwirrend zu wissen, was das Argument sein soll:

Utility.switchScene(SomeClass.class.getResource("someView.fxml")); 

Es ist irrelevant Ihre Frage, aber ich schlage auch vor, dass Sie die Stage als Argument oder über Abhängigkeitsinjektion statt Aufruf einer Funktion (Inversion of Control principle) und IOException werfen anstatt es zu fangen, wie es Benutzer der Dienstprogrammklasse über mögliche Wege informiert, die Dinge schief gehen können. Ich denke auch, dass es keine schlechte Idee ist, das Controller zurückzugeben, anstatt void zurückzugeben, damit es von Benutzern verwendet werden kann.

+0

Vielen Dank, vor allem für die Tipps zur Verwendung guter Praktiken! – saadq

+0

Gern geschehen. Ich bin froh, dass es geholfen hat. – Omid

2

Wenn Sie getClass() innerhalb static Methoden aufrufen möchten, müssen Sie es zusammen mit dem Klassennamen verwenden, so müssen Sie Ihren Code ändern, wie unten dargestellt:

loader.setLocation(Utility.class.getClass().getResource(path)); 
+0

Hmm, das macht definitiv den Fehler weg aber es scheint nicht zu gefallen, es sagt 'java.lang.IllegalStateException: Location ist nicht gesetzt. 'Ist dies ein Fall, in dem ich diesen Code nicht abstrahieren kann diese separate Utility-Klasse? – saadq

+0

Haben Sie die Variable 'Pfad' richtig eingestellt? – developer

Verwandte Themen