2016-08-04 10 views
0

Ich habe eine Klasse, die eine Schnittstelle implementiert. Aus meiner Basisklasse, ich bin eine Instanz der implementierten Klasse wie folgt:(JavaFX) Wie Methode der Klasse zwischen Konstruktor und initialize() aufrufen?

Class newTab; 
TransactionTabInterface tabInterface = null; 
try { 
    newTab = Class.forName("[package] + title); 
    tabInterface = (TransactionTabInterface) newTab.newInstance(); 
    tabInterface.setRootController(this); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

Dies ist notwendig, da ich den Namen der Klasse weiß ich nicht (an anderer Stelle title bestimmt) instanziiert muß.

Das Problem, das ich habe, ist, dass ich innerhalb der neuen Klasse sofort auf rootController zugreifen muss. Ich habe eine Methode innerhalb der Klasse, die es mir erlaubt, die rootController Referenz zu übergeben, wie in meinem obigen Code gesehen.

Normalerweise würde ich rootController an den Konstruktor übergeben, wenn die Klasse instanziiert, aber ich weiß nicht, wie Sie einen Parameter an den Konstruktor im obigen Aufruf newInstance() übergeben.

Bearbeiten: Um klar zu sein, ist der Code oben in meiner Hauptklasse, verwendet, um einen neuen FXML-Controller (NewTab) instanziieren.

+0

Die richtige Antwort ist, den entsprechenden Konstruktor durch Reflexion aufzurufen (wie in P.J.Meischs Antwort unten). Wenn man jedoch annimmt, dass es sich um einen Controller handelt, der einer FXML-Datei zugeordnet ist, wird die Methode 'initialize()' erst aufgerufen, wenn 'FXMLLoader.load()' aufgerufen wird. Der obige Code erreicht also das Ziel, den Root zu setzen Controller "zwischen dem Konstruktor und initialisieren()". –

+0

@James_D Der Code, den ich gepostet habe, ist NICHT wirklich Teil des FXML-Controllers. Mein FXML wird von dem Controller geladen, der die Methode 'setRootController' enthält. – Zephyr

+0

Ich meinte, dass der Controller, den Sie instanziieren, der Controller für eine FXML-Datei war, aber ich nahm an, dass Sie die FXML später geladen haben (nicht im Konstruktor des Controllers). Sie könnten immer die FXML in der 'setRootController' Methode als Workaround/Hack laden, aber die richtige Antwort ist unten. –

Antwort

2

auf Ihrem newTab Objekt können Sie getConstructor(Class<?>...) mit den Typen Ihres Konstruktors aufrufen, um einen Verweis auf diesen Konstruktor mit den gewünschten Argumenten zu erhalten.

Dann können Sie die newInstance(Object...) Methode dieses Konstruktors aufrufen, um den Konstruktor mit Argumenten aufzurufen.

+0

Danke für die Antwort, @ P.J.Meisch. Könnten Sie bitte ein wenig ausarbeiten? Wenn ich den Namen des Objekts, das ich instanziiere, nicht kenne, würde ich den Typ des Konstruktors nicht kennen, um ihn aufzurufen, richtig? Ich habe meine Frage bearbeitet, um deutlich zu machen, wo ich das ausrufen möchte. – Zephyr

+0

@Zephyr Die Methode 'getConstructor' ist eine Methode der' Klasse'. Also tust du 'newTab.getConstructor (...). NewInstance (this)', um 'this' reflektiv an den Konstruktor zu übergeben. Es ist immer noch eine Reflexion, du musst den Klassennamen nicht kennen. Lies einfach die relevanten Javadocs. –

+0

Danke für die Antwort @James_D. Ich denke, der Teil, den ich so durcheinander bekomme, ist der Code, der in den Beispielen, die ich finde, weggelassen wird (...). Der Rest macht für mich Sinn, aber ich bin nicht sicher, was 'getConstructor()' in Bezug auf die Parameter sucht. Ich habe die Javadocs darauf gelesen und sehe einfach wieder "Class ..." mit weggelassenem Code. – Zephyr

Verwandte Themen