Methode vor der Initialize aufrufen

Anfaengerin

Aktives Mitglied
Hallo Leute,

ich wollte eine Methode vor der Initialize aufrufen. Es sollen drei Zahlenwerte übergeben werden: number1, number2 und number3.

Ich hab gehört, dass man dazu den Konstruktor des Controllers benutzen soll, aber ich habe noch keine Ahnung, wie.

Wäre schön, wenn sich jemand melden würde.
 

KonradN

Super-Moderator
Mitarbeiter
Kannst Du etwas genauer sagen, was Du machen willst? Das, was Du schreibst, ist etwas verwirrend.

Was ich da heraus höre: Du hast vermutlich irgend ein Framework, welches im Rahmen der Instanz-Erzeugung dann vermutlich eine initialize Methode aufrufen kann. Und dabei geht es um einen Controller.

Das kann prinzipiell vieles sein. Wenn ich raten müsste, dann tippe ich auf JavaFX und den FXMLLoader. Der FXMLLoader erzeugt eine Instanz vom im FXML angegebenen Controller. Da kann man erst einmal nicht direkt etwas an Parametern übergeben. Hier gibt es aber zwei Möglichkeiten, wie man vorgehen kann:
1) FXMLLoader.setController: Du erzeugst eine Instanz von FXMLLoader, setzt den Controller und dann lädst Du per load das fxml File.
2) Du kannst beim load auch eine controllerFactory übergeben. Das ist dann ein Callback, welches der FXMLLoader dann nutzt, um eine Instanz zu erzeugen. Statt als Parameter bei dem load Aufruf kann man auch eine Instanz von FXMLLoader erzeugen und setControllerFactory vor dem load nutzen.

Beide Methoden haben aber das Problem, dass Du damit im Code den Controller vorgibst und Du nicht mehr die Deklaration im FXML nutzt.

3) Was man aber auch machen könnte, wäre den Ablauf etwas abzuändern:
  • Die Daten werden in der Scene oder Stage als UserData gesetzt (setUserData).
  • Dann kann man in der initialize Methode einen Handler setzen, der die UserData Daten auswertet, sobald die Scene oder Stage gesetzt wird (Listener auf der sceneProperty. Wenn die Daten in der Stage sind, dann muss man bei der neuen Scene erst die Stage holen (getRoot())).

Das ist der Weg, den ich als zielführend ansehe, wenn es um begrenzte Daten geht ... also z.B. einer Art Model für den Controller. Also genau eine Instanz einer Klasse, die da dann benötigt wird.

4) Wenn es ein spezifisches Control gibt, das mit Daten gefüllt werden muss, dann kann man prinzipiell auch eine BuilderFactory verwenden. Das ist aber dann auch ein relativ spezielles Anforderungs-Szenario ...



Aber natürlich lässt sich sowas auch noch relativ gut ausbauen. Es ist denkbar, eine ControllerFactory zu bauen, die eine KonstruktorInjection durchführt.
Wir wollen eine ControllerFactory, die ein gewisses Wissen hat (Also Dinge, die injected werden können) und wenn dann eine Klasse als Controller angefordert wird, dann wird per Reflection geschaut:
  • Alle Konstruktoren werden durchgegangen und es wird geprüft, ob alle Parameter bedient werden können
  • wird so ein Konstruktor gefunden, wird dieser aufgerufen und die Instanz zurück gegeben
  • Wird kein passender Konstruktor gefunden, dann wird eine Fehlermeldung ausgegeben

Sowas mal eben schnell per ChatGPT schreiben lassen:
Java:
import javafx.util.Callback;

import java.lang.reflect.Constructor;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Stream;

public class UniversalControllerFactory implements Callback<Class<?>, Object> {
    
    private final Map<Class<?>, Object> parameterMap;

    public UniversalControllerFactory(Map<Class<?>, Object> parameterMap) {
        this.parameterMap = parameterMap;
    }

    @Override
    public Object call(Class<?> controllerClass) {
        try {
            Optional<Constructor<?>> bestConstructor = Stream.of(controllerClass.getConstructors())
                    .filter(constructor -> canBeInstantiated(constructor, parameterMap))
                    .findFirst();

            if (bestConstructor.isPresent()) {
                Constructor<?> constructor = bestConstructor.get();
                Object[] parameters = Stream.of(constructor.getParameterTypes())
                        .map(parameterMap::get)
                        .toArray();

                return constructor.newInstance(parameters);
            } else {
                throw new IllegalStateException("Kein passender Konstruktor gefunden für " + controllerClass.getName());
            }
        } catch (Exception e) {
            throw new RuntimeException("Fehler beim Erstellen der Controller-Instanz für " + controllerClass.getName(), e);
        }
    }

    private boolean canBeInstantiated(Constructor<?> constructor, Map<Class<?>, Object> parameterMap) {
        return Stream.of(constructor.getParameterTypes()).allMatch(parameterMap::containsKey);
    }
}

Das Ganze kann man noch etwas ausbauen. Dazu könnte man z.B. schauen, was so die typischen Injection Libraries so bieten. Das ist aber jetzt erst einmal aussen vor würde ich sagen.

Die Idee gefällt mir aber. Gibt es da schon eine kleine Library? Ansonsten wäre da eine InjectionFX Library denkbar, die schnell geschrieben ist. Ggf. mit etwas mehr Features. Die Idee wäre bei einer UI, dass man so in den Controller problemlos Dinge Injecten kann.

Zusätzliche Features wären dann ggf. sowas wie Annotations auf Klassen a.la. @Component oder so. Die müsste man dann nicht explizit angeben. Und man hätte einen FXMLInjectionLoader oder so...
 

Anfaengerin

Aktives Mitglied
Ja, es handelt sich um JavaFX. Ich hab eine zweite Controller-Datei (und eine zweite Hello-View-Datei. Von der zweiten HelloController-Datei aus starte ich ein Fenster, das die 3 Zahlen mit Textfields erfragt. Auf dem Fenster ist auch ein Startbutton, der die Scene von dem ersten Controller startet. Dann verknüpfe ich an einer Stelle die beiden Controller und rufe die Methode setNumbers auf. Die muss ich im ersten Controller auch aufrufen und vor allem deklarieren. Aber hier ist meine Initializable-Methode schneller. Mein Ausbilder meinte, ich soll versuchen, die SetNumbers-Methode vorher auszuführen und durch googeln habe ich dann rausgefunden, dass man dem Konstruktor die Zahlen auch übergeben kann als Parameter. Das erste HelloController, das erste Fenster braucht die 3 Zahlen für ein Spiel, das hier läuft.
 

KonradN

Super-Moderator
Mitarbeiter
Also bei so Abhängigkeiten ist es aus meiner Sicht besser, nicht auf dem Standard initialize zu setzen sondern es individuell zu machen.

Du kannst einen Controller bauen, der etwas in der Form macht:
Java:
public class MyController {
    private boolean isInitialized = false;
    
    public void initialize(WhateverClass data) {
        // Do the initialization required with data
        
        isInitialized = true;
    }
}

Das isInitialized kannst Du auch nutzen, wenn Du bei Events aufpassen willst, ob die Initialisierung bereits erfolgt ist.

Das void initialize(WhateverClass) kannst Du auch in einem Interface definieren. Dann wäre eine Laden eines FXML Dokuments etwas wie:
Java:
FXMLLoader loader = new FXMLLoader(getClass().getResource("/myview.fxml"));
Parent root = loader.load();
object controller = loa;der.getController();
if (controller instanceof MyInitializableController initializableController) {
    initializableController.initialize(whatever);
}

(Wenn MyInitializableControler entweder das Interface oder der konkrete Controller ist.)

Sprich: Statt die Initialisierung in Controller zu packen verschiebst Du die eigentliche Initialisierung nach hinten. Das wäre eine einfache Alternative.
 

Anfaengerin

Aktives Mitglied
Das ist sehr lieb, aber ich fürchte, mein Ausbilder besteht darauf, dass ich den Konstruktor mit den Parametern fülle, die ich übergeben will. Ich glaube, dann ist das mit der Controller-Factory im Zweifel die bessere Lösung, danke dafür!
 

KonradN

Super-Moderator
Mitarbeiter
Ok, nach meinem Verständnis ist das auch eine sehr einfache Vorgehensweise - nur eben mit dem bereits beschriebenen Problem, dass Du im Code dann auch die richtige Klasse laden musst, was dem deklarativen Ansatz etwas widerspricht.

Und falls Du das noch nicht ganz erarbeitet haben solltest: Bei dem Ansatz kann das Laden dann so aussehen:
Java:
FXMLLoader loader = new FXMLLoader(getClass().getResource("/my-view.fxml"));
loader.setControllerFactory(clazz -> new MyController("Test", 42));
Parent root = loader.load();

Natürlich ist es notwendig, die Ressource, den Klassenname des Controllers und die notwendigen Parameter anzupassen. Und in der FXML muss dann natürlich auch der Controller (in meinem Beispiel MyController) als fx:controller aufgeführt werden.



Ich habe ansonsten - falls es jemanden interessiert (lass Dich davon nicht verwirren @Anfaengerin! Evtl. einfach ignorieren!) - unter https://github.com/kneitzel/injectFX mal versucht, so einen ersten Ansatz für ein automatisches Injecten zu bauen. Ist aber nur eine kleine Spielerei, die ich gestern Abend mal schnell gemacht habe. Ist halt noch nicht abgeschlossen, aber zum einen habe ich da die Klasse InjectingControllerFactory, die standalone genutzt werden kann. Und ansonsten dreht sich da vieles um automatisches Injecten von Komponenten, die mit @FXMLComponet markiert wurden...
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...
Ähnliche Java Themen
  Titel Forum Antworten Datum
M JavaFX Methode nach initialize() aufrufen AWT, Swing, JavaFX & SWT 6
F String mit getText() auslesen und an Methode übergeben AWT, Swing, JavaFX & SWT 1
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
P Methode wird nicht überprüft AWT, Swing, JavaFX & SWT 4
P paintComponent-Methode wird dauernd neu aufgerufen AWT, Swing, JavaFX & SWT 2
M passende Reflexion-Methode?? AWT, Swing, JavaFX & SWT 1
M Seltsame Exception bei setVisible(true) Methode in einem JFrame AWT, Swing, JavaFX & SWT 2
M Swing Methode datenLesen() greift auf catchBlock zu? AWT, Swing, JavaFX & SWT 25
K JavaFX unterschiedliche (mehrere Fenster) in seperater Main Methode AWT, Swing, JavaFX & SWT 26
U was bewirkt die methode fill und unterschied zu anderen fill Methoden in 2dgraphics? (Java)? AWT, Swing, JavaFX & SWT 6
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
Z Methode bei Boolean change neu Ausführen AWT, Swing, JavaFX & SWT 9
T TableView über Methode befüllen AWT, Swing, JavaFX & SWT 10
H Event Handling Thread - Abruf der get-Methode AWT, Swing, JavaFX & SWT 5
L JFrame Gui in anderer Methode aufrufen AWT, Swing, JavaFX & SWT 0
J Rekursive Methode JProgressBar AWT, Swing, JavaFX & SWT 4
A Methode pausieren bis anderes Ereignis ausgeführt AWT, Swing, JavaFX & SWT 2
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
1 Swing Progressbar benutzen um Fortschritt einer Methode anzuzeigen AWT, Swing, JavaFX & SWT 4
J Compiler in der JavaFX stop() Methode warten lassen bist eine Aktion in einer anderen Scene gemacht AWT, Swing, JavaFX & SWT 5
L JavaFX Problem beim Aufrufen einer Methode AWT, Swing, JavaFX & SWT 5
J 2D-Grafik Brauche Erklärung von Methode AWT, Swing, JavaFX & SWT 1
L Methode zum Füllen einer ComboBox AWT, Swing, JavaFX & SWT 4
I Methode Draw3DRect und DrawRect AWT, Swing, JavaFX & SWT 2
krgewb 2D-Grafik paint-Methode wird zu oft ausgeführt AWT, Swing, JavaFX & SWT 5
S Zeichen ohne paint-Methode AWT, Swing, JavaFX & SWT 2
K Methode repaint() AWT, Swing, JavaFX & SWT 1
A Methode in bestimmten Intervall ausführen AWT, Swing, JavaFX & SWT 2
J Swing Wann brauche ich @Override vor der paint()-Methode? AWT, Swing, JavaFX & SWT 1
Z jLabel von Methode aus aktualisieren AWT, Swing, JavaFX & SWT 7
Q AWT Methodenaufruf aus actionPerformed-Methode AWT, Swing, JavaFX & SWT 4
G Eine paint-Methode, 2 Welten? AWT, Swing, JavaFX & SWT 3
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
T Swing Methode in Listener aufrufen AWT, Swing, JavaFX & SWT 3
P keyTyped-Methode AWT, Swing, JavaFX & SWT 1
D JavaFX Java Methoden mit JavaFX Methode kommunizieren lassen? AWT, Swing, JavaFX & SWT 3
F JavaFX Mit einer Methode auf Stage zugreifen. AWT, Swing, JavaFX & SWT 8
A paint-Methode aufrufen AWT, Swing, JavaFX & SWT 13
C JavaFX Auf Nodes einer FXML-Datei in start Methode zugreifen AWT, Swing, JavaFX & SWT 5
R GUI Element in einer Methode aktualisieren (JTextPane) AWT, Swing, JavaFX & SWT 13
J Swing Problem mit Graphics Methode AWT, Swing, JavaFX & SWT 4
K Swing Durch Methode erzeugte Buttons ansteuern AWT, Swing, JavaFX & SWT 5
S Grafik: Programm kommt nicht zur paint()-Methode AWT, Swing, JavaFX & SWT 6
T LayoutManager Methode, um Bildschirm(fenster) für Aktualisierungen zu blockieren bzw. freizugeben gesucht AWT, Swing, JavaFX & SWT 2
W Paint-Methode in anderer Klasse funktioniert nicht AWT, Swing, JavaFX & SWT 7
S PaintIn - Methode AWT, Swing, JavaFX & SWT 1
J Swing ungewünschter Nebeneffekt bei der repaint() Methode AWT, Swing, JavaFX & SWT 3
A befüllen eines JTables mittels Methode AWT, Swing, JavaFX & SWT 10
K Kann nicht auf GUI Elemente zugreifen, mit einer Methode im Controller klappts, mit der anderen nich AWT, Swing, JavaFX & SWT 10
D JavaFX Interface Initializable - Was machen die Parameter in der Methode inizializeable() ? AWT, Swing, JavaFX & SWT 4
S JLabel-Text in Methode setzen? AWT, Swing, JavaFX & SWT 2
F JavaFX Zugriff auf Controller Methode von einer normalen Klasse aus AWT, Swing, JavaFX & SWT 4
F 2D-Grafik Was ruft die Paint - Methode auf ? AWT, Swing, JavaFX & SWT 2
S JButton u. Label auf paint-Methode AWT, Swing, JavaFX & SWT 1
S Paint Methode ohne implements JPanel AWT, Swing, JavaFX & SWT 1
S Farbe ändern bei der paint-Methode AWT, Swing, JavaFX & SWT 5
J ActionListener soll auf paint() Methode zugreifen AWT, Swing, JavaFX & SWT 1
J Problem mit der paint Methode AWT, Swing, JavaFX & SWT 0
J JLabel während einer methode aktualisieren AWT, Swing, JavaFX & SWT 6
Junb 2D-Grafik paint() Methode bugt? AWT, Swing, JavaFX & SWT 2
T Swing Label aus anderer Methode bearbeiten AWT, Swing, JavaFX & SWT 2
I Paint-Methode von nicht statischen Objekten aufrufen AWT, Swing, JavaFX & SWT 3
C Methode über Buttonklick starten AWT, Swing, JavaFX & SWT 8
S Swing Mit einem Link eine Methode aufrufen AWT, Swing, JavaFX & SWT 2
P Swing Auf Methode zugreifen (am Schlauch steh) AWT, Swing, JavaFX & SWT 5
D JSlider "laggt" nach überschreiben der paint methode AWT, Swing, JavaFX & SWT 2
D Swing DefaultTableModel setValueAt Methode AWT, Swing, JavaFX & SWT 7
J valueChanged()-Methode liefert unbrauchbare Daten AWT, Swing, JavaFX & SWT 4
T Swing JPanel - "Open" Methode? AWT, Swing, JavaFX & SWT 6
P Swing actionPerformed()-Methode funktioniert nicht AWT, Swing, JavaFX & SWT 3
M Applet Bricht Methode zwischendruch ab AWT, Swing, JavaFX & SWT 11
K Per Textfield Methode ausführen AWT, Swing, JavaFX & SWT 6
J Swing JTable - nach Sortieren andere Methode aufrufen AWT, Swing, JavaFX & SWT 2
C Swing Was macht die Methode "setDataProviderCreditShown(boolean b)" AWT, Swing, JavaFX & SWT 4
R Swing Mit Swing eine throws Exception Methode öffnen AWT, Swing, JavaFX & SWT 3
GianaSisters Swing jTable's valueChanged Methode überschreiben AWT, Swing, JavaFX & SWT 2
P EDT Problem? Kein Aufruf der repaint Methode AWT, Swing, JavaFX & SWT 6
A Paint Methode externer auruf AWT, Swing, JavaFX & SWT 5
N Methode zum Prüfen ob Jtextfield verändert worden ist AWT, Swing, JavaFX & SWT 2
K beim Schließen des JFrames, Methode aufrufen AWT, Swing, JavaFX & SWT 3
J AWT Methode paint() AWT, Swing, JavaFX & SWT 4
X Bild via FileChooser in paint-Methode laden AWT, Swing, JavaFX & SWT 2
E Umgang mit der Update Methode AWT, Swing, JavaFX & SWT 38
D Applet Methode in Timer einbinden AWT, Swing, JavaFX & SWT 6
Screen Fehler bei Get-Methode für ArrayList AWT, Swing, JavaFX & SWT 8
P Swing JPanel über Methode setzen AWT, Swing, JavaFX & SWT 2
A Frage zur Methode matches() AWT, Swing, JavaFX & SWT 2
eskimo328 Java6 Methode in Java5 verwenden (memory leak JInternalFrame) AWT, Swing, JavaFX & SWT 4
T Swing setText()-Methode Funktioniert nicht AWT, Swing, JavaFX & SWT 7
L JLabel Methode setText funktioniert nicht AWT, Swing, JavaFX & SWT 5
S Thread.sleep() in einer methode fürs zeichen AWT, Swing, JavaFX & SWT 3
S Visual Editor mit main Methode AWT, Swing, JavaFX & SWT 3
G paint-Methode kopiert GUI AWT, Swing, JavaFX & SWT 14
F Swing JFrame Methode beim Schließen aufrufen AWT, Swing, JavaFX & SWT 5
D Zwei String Attribute über eine Methode als Zeilen in einer Tabelle darstellen AWT, Swing, JavaFX & SWT 9
H applet Methode aus abstrakter Klasse aufrufen AWT, Swing, JavaFX & SWT 12
S Methode fireTableDataChanged() AWT, Swing, JavaFX & SWT 2
Y Swing Problem mit Main Methode AWT, Swing, JavaFX & SWT 8
E 2D-Grafik Zeichnen außerhalb der "paintComponent"-Methode? AWT, Swing, JavaFX & SWT 5
R Run Methode Probleme AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben