Wie greife ich auf ein Element zu, welches ich beim Scenebuilder erstellt habe

berserkerdq2

Bekanntes Mitglied
Ich habe z. B. ein Circle im scenebuilder eingefügt und dem eine Id gegeben.

Danach habe ich noch eine Controllerklasse erstellt und die beim Circle beigefügt.

Dann habe ich dem Circle eine Id gegeben und in der Controllerklasse habe ich dann ein private Circle mit dem ID-Namen erstellt.

Aber kann den Circle trotz importierter Circleklasse nicht nutzen?

Also kann den Circle erstellen, aber nicht nutzen?

Und ich muss den Circle wie die Id nennen oder?
 
Also nochmals eine Ergänzung, da ich nicht bearbeiten kann.

Ich habe ein Circle im Scenebuilder erstellt und diesem die Id: circle gegeben.

Dann bin ich in die Controllerklasse und habe:
Java:
@FXML
Circle circle;

public void test(){
    circle.setCenterX(230);
}

Das sollte nur ein Beispiel sein, wollte das halt verschieben, aber erhalte eine Fehlermeldung, der Controller ist beim Circle gesetzt, mit Scenebuilder, also die Klasse wurde gesetzt.

Was kann man da tun?
Also wenn ich den Code ausführe, kommt da eine Fehlermeldung, warum?

(Und muss ich überhaupt eine Methode nehmen, wo ich circle.setCenterX schreibe? Warum kann man nicht einfach ohne eine Methode dies machen?)

(Beziehungsweise hab jetzt einfach ein neues Circle genommen, ID gesetzt und das gleiche gemacht, jetzt geht die Klasse wieder ohne Fehlermeldung, aber das was ich gemacht habe, also setCenterX wird nicht auf dem Circle ausgeführt, es ist in der Stelle, wie auch im Scenebuilder gesetzt?)
 
Zeige Mitte immer den ganzen Code, also das ganze FXML und auch die ganze Controller Klasse. Wo rufst du z.B. die Methode auf?
Aso, muss ich die Methode noch extra aufrufen? Ich dachte, wenn ich eine Methode im Controller erstelle und den nicht speziell zuweise, dass die Methoden automatisch aufgerufen werden, wenn ich mein Programm starte.

Ich wollte einfahc, dass wenn ich die Klasse starte / run ausführe, dass das was ich im Controller gemacht habe, ausgeführt wird, muss ich das dann in eine initialize Methode machen, weil die immer aufgerufen wird?
 
Nein, Dir sollte klar sein, dass nie etwas einfach so aufgerufen wird. Es passiert nix von alleine!

Schon deine main Methode wird nur aufgerufen, weil Du beim Start von Java genau dies verlangst (direkt, weil Du diese Klasse als Hauptklasse angibst oder indirekt, weil es in dem Manifest so eingetragen ist).

Das war ja auch der Punkt mit der initialize Methode. Die wird nur aufgerufen, weil der FXMLLoader explizit nach dieser Methode schaut um diese dann ggf. aufzurufen. Wenn Du die "hugo" nennst, dann findet der FXMLLoader keine "initialize" Methode und ruft diese daher auch nicht auf.
 
Nein, Dir sollte klar sein, dass nie etwas einfach so aufgerufen wird. Es passiert nix von alleine!

Schon deine main Methode wird nur aufgerufen, weil Du beim Start von Java genau dies verlangst (direkt, weil Du diese Klasse als Hauptklasse angibst oder indirekt, weil es in dem Manifest so eingetragen ist).

Das war ja auch der Punkt mit der initialize Methode. Die wird nur aufgerufen, weil der FXMLLoader explizit nach dieser Methode schaut um diese dann ggf. aufzurufen. Wenn Du die "hugo" nennst, dann findet der FXMLLoader keine "initialize" Methode und ruft diese daher auch nicht auf.
Jetzt verstehe ich, also initialize ist eine Methode, die FXML auch aufruft, wenn die nicht definiert wurde in der Controllerklasse, wir überschreiben die also, wenn wir bei der Controllerklasse Sachen ausführen wollen, dei direkt beim Start der MEthode passieren sollen?
 
Jetzt verstehe ich, also initialize ist eine Methode, die FXML auch aufruft, wenn die nicht definiert wurde in der Controllerklasse, wir überschreiben die also, wenn wir bei der Controllerklasse Sachen ausführen wollen, dei direkt beim Start der MEthode passieren sollen?
Nicht FXML ruft etwas auf. Die Klasse, die sowas aufrufen könnte, wäre der FXMLLoader.

Und wenn die Methode nicht existiert, dann kann sie auch nicht aufgerufen werden. Der FXMLLoader schaut sich die Klasse vom Controller aber per Reflection an um unter anderem auch nach so einer Methode zu schauen.

Und wir überschreiben die Methode nicht. Ein Controller erbt meist von Object und daher gibt es da so eine Methode nicht. Es ist aber eine gute Praxis, Initializable zu implementieren und dann kann man @Override nutzen.

Und das ist die Methode, die weitergehende Initialisierungen durchführen kann, nachdem der FXMLLoader fertig ist mit seinen Initialisierungen.

Das Problem bei dem automatischen initialisieren ("injecten") von Werten ist: Im Konstruktor sind die noch nicht eingefügt. Es muss also erst die Instanz erzeugt werden (Konstruktor läuft) und dann kann ein FXMLLoader Controls in Variablen zuweisen und so. Und da dann ggf. noch Dinge erfolgen sollen gibt es dieses initialize das aufgerufen wird, wenn es existiert.
 
Nicht FXML ruft etwas auf. Die Klasse, die sowas aufrufen könnte, wäre der FXMLLoader.

Und wenn die Methode nicht existiert, dann kann sie auch nicht aufgerufen werden. Der FXMLLoader schaut sich die Klasse vom Controller aber per Reflection an um unter anderem auch nach so einer Methode zu schauen.

Und wir überschreiben die Methode nicht. Ein Controller erbt meist von Object und daher gibt es da so eine Methode nicht. Es ist aber eine gute Praxis, Initializable zu implementieren und dann kann man @Override nutzen.

Und das ist die Methode, die weitergehende Initialisierungen durchführen kann, nachdem der FXMLLoader fertig ist mit seinen Initialisierungen.

Das Problem bei dem automatischen initialisieren ("injecten") von Werten ist: Im Konstruktor sind die noch nicht eingefügt. Es muss also erst die Instanz erzeugt werden (Konstruktor läuft) und dann kann ein FXMLLoader Controls in Variablen zuweisen und so. Und da dann ggf. noch Dinge erfolgen sollen gibt es dieses initialize das aufgerufen wird, wenn es existiert.
Danke, aber ist @Override nicht immer fürs Überschreiben?

Und ist es allgemein immer so, dass bei jeder Klasse initalize aufgerufen wird? Und ich immer Initializable implementieren könnte und initialize dann auch immer ausgeführt wird oder ist es speziell hier so?

Und dürfte ich fragen, woher du eigentlich das alles weißt? Wenn du dein Wissen von einem Javabuch hast, könntest du das mir den Namen des Buches nennen?
 
Danke, aber ist @Override nicht immer fürs Überschreiben?
Ja, das setzt aber voraus, dass man da etwas überschreibt, also eine übergeordnete Klasse oder ein Interface, das man implementiert, diese Methode hat. Du hattest aber in einem Thread mal geschrieben, dass Du das Interface auch rausgeworfen hättest und dann würde die Annotation zu einem Fehler führen.

Und ist es allgemein immer so, dass bei jeder Klasse initalize aufgerufen wird? Und ich immer Initializable implementieren könnte und initialize dann auch immer ausgeführt wird oder ist es speziell hier so?
Nein, das ist hier so. Das ist - wie gesagt - eine Sache vom FXMLLoader.

Und dürfte ich fragen, woher du eigentlich das alles weißt? Wenn du dein Wissen von einem Javabuch hast, könntest du das mir den Namen des Buches nennen?
Das ist zusammen getragen über die Jahre und Jahrzehnte. Man stolpert halt mit der Zeit über sehr viel. Und vieles ergibt sich einfach auch direkt selbst, denn es ist so, dass sehr viele Dinge sich sehr stark ähneln. Wenn damals ein UI Framework gebaut wurde, dann sah das halt aus wie Swing / Windows Forms / MFC / ... Da konnte man nehmen was man will. Ich habe nie Delphi gemacht, aber ich bin sicher: Unter dem Strich wird es auch so gewesen sein.
Dann war die Idee endlich da mit deklarativen UIs und dann war es WPF, JavaFX, ... Auch hier sind die gleichen Ideen verwendet worden und umgesetzt worden.

Je mehr man sieht, desto mehr sieht man die Gemeinsamkeiten und dann fällt es einem sehr leicht, so Dinge zu verstehen und zu begreifen.

Ein Buch oder so gibt es da nicht einmal. Ich lese zwar viele Fachbücher, aber ich habe da zu JavaFX oder so nie ein Buch gesehen.
 
Ja, das setzt aber voraus, dass man da etwas überschreibt, also eine übergeordnete Klasse oder ein Interface, das man implementiert, diese Methode hat. Du hattest aber in einem Thread mal geschrieben, dass Du das Interface auch rausgeworfen hättest und dann würde die Annotation zu einem Fehler führen.


Nein, das ist hier so. Das ist - wie gesagt - eine Sache vom FXMLLoader.


Das ist zusammen getragen über die Jahre und Jahrzehnte. Man stolpert halt mit der Zeit über sehr viel. Und vieles ergibt sich einfach auch direkt selbst, denn es ist so, dass sehr viele Dinge sich sehr stark ähneln. Wenn damals ein UI Framework gebaut wurde, dann sah das halt aus wie Swing / Windows Forms / MFC / ... Da konnte man nehmen was man will. Ich habe nie Delphi gemacht, aber ich bin sicher: Unter dem Strich wird es auch so gewesen sein.
Dann war die Idee endlich da mit deklarativen UIs und dann war es WPF, JavaFX, ... Auch hier sind die gleichen Ideen verwendet worden und umgesetzt worden.

Je mehr man sieht, desto mehr sieht man die Gemeinsamkeiten und dann fällt es einem sehr leicht, so Dinge zu verstehen und zu begreifen.

Ein Buch oder so gibt es da nicht einmal. Ich lese zwar viele Fachbücher, aber ich habe da zu JavaFX oder so nie ein Buch gesehen.
Genau bis jetzt funktioniert es Fehlerfrei, auch ohne die Implementierung von Initializable. Du hast geschrieben, dass das guter Style ist, dass man das vorher implementiert und override macht, deshalb werde ich das auch verwenden, aber könnte es zu Fehlern führen, wenn man das nicht macht oder ist das rein stilistisch?
 

Zurück
Oben