Texte Verändern von Controller in Methode

Hallo,

kurz zu meinem problem:
Ich habe eine Fabrikmethode erstellt, in der ich die Deutsche und Englische spreche als Klasse habe.
In meiner GUI existiert ein choiceBox, wo man zwischen den beiden Sprachen wählen kann.
Nun ist mein GUI standardmäßig auf deutsch, aber wenn man Englisch wählt, soll diese alle Texte und Buttons usw. auf Englisch umändern.
Daher meine Frage, wie kann ich von meiner Klasse Englisch auf die buttons usw. zugreifen von meinem Controller?

Mein erster Gedanke war, in der Englisch Klasse:

	
	public void setFirstController (Controller t){
		firstController = t;
	}```

Doch ohne erfolg.

Also ich würde auf das gute alte Observer-Pattern zurückgreifen.

Jeder Controller bekommt den LanguageObservable (von Dir zu erstellende Klasse) übergeben. In der init-Methode registriert sich jeder Controller beim Observable und wird von da an über Sprachänderungen benachrichtigt, so dass er die Beschriftungen seiner Komponenten ändern kann.

Der Controller, der die SprachAuswahl hat ruft dann eben die Benachrichtigungsmethode des LanguageObservable auf.

bye
TT

Man kann das ganze auch ein Schritt weiter denken (was ich auch schonmal getestet habe), dass Stichwort sind Properties

Ich habe das folgendermaßen gemacht:
Eine Klasse für die Sprache (static sachen ja böse ich weiß^^) in der es ein Property für das Locale gibt, eine Methode um für den Key die entsprechende Übersetzung zu bekommen und eine Methode die für ein bestimmten Key ein StringBinding erstellt (über createStringBinding).

Dann kannst du einfach das TextProperty deiner Komponenten (Buttons, Labels etc.) an dieses StringBinding binden, und sobald das Locale verändert wird in der Klasse, werden alle gebundenen Komponenten ebenfalls geändert (Vorrausgesetzt es gibt ein ResourceBundle für das Locale)

Zugegeben man kann das ganze nicht mehr so schön über den SceneBuilder bzw. FXML machen (dort gibt es ja die Möglichkeit über LanguageKeys (%key%) und dem entsprechenden ResourceBundle beim Laden die Sprache zu bekommen) nur lässt sich das ganze dann nicht so einfach während der Laufzeit ändern

MfG
Clayn

Geht auch mit den LanguageKeys. Du setzt via Locale.setDefault die neue Sprache und lädst dein Root Parent neu ein. Danach ersetzt du das vorhandene mit dem neuen.

Dann musst du aber auch immer die Stage irgendwo speichern und den aktuellen Zustand eventuell. Ich glaube das ist je nach Situation mehr Aufwand als nötig ist. Aber letztendlich muss das jeder selber wissen

Ne musste nicht. Du operierst auf dem aller obersten Panel (also deinem Root element) und setzt da einen entsprechenden Handler. Der lädt über einen FXMLLoader alles darauf liegende neu, cleared seine children und fügt das Ergebnis vom loader hinzu. Machen wir hier auch so und funktioniert wunderbar.