Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich habe eine Login Stage in der über eine Methode checkPasswort(user, pass) innerhalb meiner User Klasse, die die korrekten Zugangsdaten prüft und bei Erfolg die restlichen Daten für das UserObjekt vervollständigt.
Sprich: Ich gebe meinen Usernamen und mein Passwort ein und wenn es diese gibt, setze ich alle weiteren Daten wie Anschrift, Telefonnummer etc...
Doof ist nur, dass ich nach dem erfolgreichen befüllen der Variablen in der UserKlasse das Loginfenster schließe und eine neue Stage öffne.
Die Frage ist nun: Gibt es eine Möglichkeit dieses UserObjekt in die neue Stage "mitzunehmen"?
Ist kein konkretes Projekt sondern nur Übung die mich vor dieses Problem bzw diese Frage gestellt hat.
Dachte mir schon sowas in der Art. Kannst du mir etwas mehr dazu sagen? Ich wüsste gerne wie man sowas angeht.
Ich denke ich muss irgendwie im ersten Controller (mit dem User Objekt) eine Methode im zweiten Controller aufrufen und das Objekt als Parameter übergeben oder wie?!
Wenn ich dein Problem richtig verstehe, hab ich sowas ähnliches unlängst über eine Stage-Erweiterung gelöst. In meinem Fall wollte ich ein neues Fenster haben (das eigentliche Hauptfenster wird indessen eingefroren), in dem der Benutzer ein paar Sachen eingibt und auf OK (Abbrechen oder das sonstwie beenden) klickt und das Fenster wieder verschwindet.
Aus der "MainView" heraus:
Java:
private void showUserWindowForInput(){
StampEditor editor = new StampEditor();
editor.showAndWait(); //Warte bis der Benuter im Editor fertig ist
Object returnObject = editor.getReturnValue();
}
Die Klase StampEditor:
Java:
public class Stampeditor extends Stage{
//GUI im Konstruktor bauen
private void callThisMethodForReturnToMainView(){
this.hide();
}
public Object getReturnValue(){
return someMemberObject;
}
}
So jedenfalls in Kurzform. Irgendwer schrieb hier mal daß das schlechter Stil sei, ich fand das Ergebnis aber recht schick (und wollte das zweite Fenster explizit), und der Rest vom Programm (Controller) kriegt davon auch nichts mit.
Naja 2 Dinge die für schlechten Stil sprechen:
- du erbst von Stage. Man erbt immer nur von einer Klasse wenn man dess Funktionalität erweitern will. Gibst du der Stage neue Funktionalität oder nutzt du nur dessen Funktionalität
- du efindest damit das Rad neu. Ein Dialog bietet schon genau das. Neues Fenster, Nutzereingaben, OK, Cancel Button, Objekt zurück geben
Dann kommt es jetzt noch darauf an, ob Du Dein Model bereits beim Initialisieren des neuen Fensters brauchst oder nicht. Falls ja, kannst Du dem FXMLLoader eine ControllerFactory mitgeben. Ansonsten reicht es, Dir vom FXMLLoader den verwendeten Controller geben zu lassen und dort einen Setter aufzurufen.
@Robat Nö, das war schon weitaus mehr als ein einfaches Dialogfester. Ich hatte auch nicht nur ein solches Editorfenster, sondern...keine Ahnung...fünf oder so, und später kommen noch ein paar hinzu. Am Anfang hatte ich eine abstrakte Editorklasse um so ein paar ständig wiederkehrende Grundfunktionalitäten einzubauen, und für jeden Editor habe ich dann jeweils von dieser Klasse abgeleitet. Jeder von diesen Editoren hat dann ein Objekt geliefert, die auch alle aus dem gleichen Vererbungsbaum kamen, das hat sich da durchaus so angeboten. Ich stelle es irgendwann mal ins Internet (wenn die Pre-Alphaversion fertig ist), dann bin ich mal gespannt was ihr dazu sagt.
Welche Komponenten dieses Fenster am Ende hat ist mEn völlig irrelevant. Du wolltest ein Fenster welches modal über deinem Hauptfenster liegt und, wenn es geschlossen wird, irgendein Objekt zurück gibt, welches aus den Eingaben generiert wurde. Das ist mEn alles Eigenschaften, die für einen Dialog sprechen. Über den ResultConverter kann man dann die Daten aus den Feldern/Checkboxen/what ever holen und sich sein Objekt zusammen bauen. Das gibt man dann zurück.