Mit einem Controller 2 FXML Dateien bedienen?

...komplette Frage anzeigen

1 Antwort

am besten hat jede .fxml ihre eigene Controllerklasse. Mix die besser nicht zusammen. Wenn beide klassen auf die selbe Ressource zugreifen müssen, mach halt eine einfache Pojo klasse dazwischen, die die Ressourcen hält. Java-Basics halt.

tamilboy 25.06.2014, 12:57

hmm also lasse ich die Controller separat und vereine die nicht und benutze ein pojo klasse um auf Attribute zu zugreifen die ich in einem der Controller deklariert habe und in dem anderen benutzen will?

0
tsiegleauq 25.06.2014, 13:03
@tamilboy

genau so könntest du es machen. Ein alternativer weg wäre einen Singleton Controller anzulegen der eine Liste hält die die Ressourcen hält. In jeder klasse könntest du dann mit MySingleton.getInstance() die benötigten Daten hereinholen.

Zwischendurch immer aufpassen, dass man das sauber strukturiert. Lieber erstmal auf dem Papier aufmalen und dann ausprogrammieren.

1
tamilboy 25.06.2014, 13:14
@tsiegleauq

ich habe grade die deffinition von pojo gegooglet und muss sagen das ich es nicht verstehe -.-

also wiki sagt pjos sind klassen, die unabhängig von anderen klassen sind stimmt das?

also müsste ich quasi eine neue klasse erstellen, in der ich alle anderen klassen, variabeln erstelle und dann in controller1 und controller2 diese pojo klasse erzeuge?

0
tsiegleauq 25.06.2014, 20:13
@tamilboy

Ah Okay, ich wusste nicht dass es bei dir dabei scheitert. Über den Begriff "POJO" brauchst du dir keine Gedanken machen ;)

Pojo ist "Plain Old Java Objekt" also ein stinknormales Objekt das keine besonderen Eigenschaften hat.

Zwei oder mehr Objekte sollen auf dieselbe Ressource zugreifen. Also eine Ressource entsteht zur Laufzeit, soll überall verfügbar sein und ihren Wert behalten. Richtig? (hier bitte Einwände stellen, falls ich das falsch verstanden habe)

Ich gehe jetzt erstmal davon aus, und würde das so machen:

Du baust eine Java Klasse als Singleton. Diese Klasse hält dann deine ganzen anderen Objekte, die von jeder anderen Klasse verändert und abgerufen werden dürfen. Wie sieht so was aus?

public class ResourceHandler {

private static ResourceHandler instance = new ResourceHandler();

//der ist private, weil er niemals außerhalb von
//sich selbst erzeugt werden soll
private ResourceHandler() {}

public static ResourceHandler getInstance() {
    return instance;
}

}

In jeder anderen klasse kannst du jetzt den ResourceHandler mittelst

ResourceHandler rs = ResourceHandler.getInstance(); 

hereinholen. Das ist dann immer derselbe ResourceHandler. Wenn du auf dem was veränderst, veränderst du den auch für jedes andere Objekt.

Alternativ ginge es übrigens auch mit einem "Observer" (sieh dir hierzu das Pattern an), der "lauscht" permanent darauf ob in einer anderen Klasse etwas verändert wurde.

1
tamilboy 25.06.2014, 23:43
@tsiegleauq

uhhhhhhh ahhhhhh !!!! Klappt ganz wunderbar :D Danke dir

leider habe ich jetzt ein weiteres Problem, wäre nett, wen du mir da auch helfen kannst.

Ich erstelle ja im Controller1 das neue fenster und somit ja den 2. controller. Dieser soll aber schon beim erstellen sachen vergleichen und dementsprechend sein aussehen verändern. Das vergleichen und aussehn ändern das geht, nur nicht das der controller2 schon beim erstellen sein aussehn ändert. Ich habe da einfach für controller 2 ein konstrukter erstellt, da ich gelernt habe, das der konstruktur beim erzeugen aufjeden fall ausgeführt werden muss. da bekomme ich ein nullpointexep was damit zu tun hat, das die variabel in dem konstruktor nicht die gleiche ist, die ich aus der fxml habe trotz selber bezeichnung... also nehme ich mal an das controller keinen konstruktor haben dürfen wie aber mache ich dann das ändern direkt beim erstellen des fensters?

0
tsiegleauq 26.06.2014, 00:52
@tamilboy

Is JavaFX spezifisch. Controller sollten tatsächlich keine Konstruktoren haben.

Controller sollte "Initializable" implementieren. Danach existiert die Funktion "initialize(URL, ResourceBundle)"

Hier n Beispiel:

public class NewUserController implements Initializable  {
    @FXML private TextField userName;

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        this.UserName="bÄrbel";

    }
}

Sorgt dafür dass das TextField (mit der id) userName von Anfang An auf "bÄrbel" gesetzt wird. In die initialize-Funktion kannst du jetzt deine vergleiche schreiben.

1

Was möchtest Du wissen?