Variablen zwischen Frames

fl_ex

Bekanntes Mitglied
Hey Programmerz,

hab eine Frage bezüglich Variablenaustausch zwischen Frames bzw. Klassen...
Hab eine Klasse "Create" das ist ein Frame mit button comboboxen etc...
wenn ich auf den Speichern button klick macht er auch die printausgabe(als test)

Nun möchte ich das davor ein programm läuft wo ich dann auf "create" klicken kann, das wird dann setVisible(false) und das "create" eben "true" ....
Nun möchte ich dort werte eingeben können und die sollen dann per buttonklick in den Tree vom ersten fenster übertragen werden...

...es sind mehrere werte, also ein Return funzt da nicht ... und irgendwie muss ich den ersten "anhalten" damit das neue fenster erstmal arbeiten kann...
(hatte es mit getter und setter gemacht, aber der lief dann einfach durch ohne zu stoppen)
 
Zuletzt bearbeitet:
Es gibt keine spezielle Methodik für die Verarbeitung von "Variablen zwischen Frames". Es ist so wie überall im Code: Brauchst du eine Sache, na dann muss halt im Scope eine Variable verfügbar sein die diese Sache enthält. zB so:

Java:
Tree tree = new Tree(...)
MyFrameOne = new MyFrameOne(tree); // added den Tree auf sein Content Pane
MyFrameTwo = new MyFrameTwo(tree); // nutzt den Tree in der actionPerformed des Buttons

Es gibt da aber mehrere Wege. Du kannst auch den gesamten ActionListener in das zweite Fenster hineinreichen und das klatscht den nur noch auf den Button. Oder du erstellt ein Interface "TreeDataListener" oder sowas, und dein Tree bzw das Fenster, das den Tree enthält implementiert das und registriert sich beim zweiten Frame, das dann eine gewisse Methode aufruft um alle Werte zu übergeben wenn man in diesem Frame dann den Button klickt.
 
Zuletzt bearbeitet:
Wir schreiben irgendwie auch nur gleichzeitg an edit's oder 😉

Also nochmal ein konkreter Vorschlag wie solche Kommunikationen zwischen Instanzen am schönsten sind:
Java:
interface TreeDataListener{

  public void dataChanged(Data data); // oder halt (int wert1, String wert2) usw keine Ahnung wie deine Daten aussehen
}

Dein Tree oder das Frame das den Tree enthält implementert das Interface:

Java:
class FirstFrame extends JFrame implements TreeDataListener{

   private Tree myTree;

   //...

   public void dataChanged(Data data){
        myTree.setData(data); // oder was auch immer du da für nen Setter hast
   }
}

Schöner wäre wenn du ne Klasse für den Tree hast der das implementiert, nicht das ganze Frame aber ich will jetzt nicht noch eine Klasse hier schreiben 😉

Das andere Frame dann:
Java:
class Create extends JFrame{

  private TreeDataListener treeDataListener;

   public Create(TreeDataListener treeDataListener){
         this.treeDataListener = treeDataListener;
   }

   // ActionListener des Buttons in diesem Frame:
   public void actionPerformed(..){
        treeDataListener.dataChanged(new Data(textField1.getText(), myComboBox.getSelectedValue().toString());
   }
}
und dann im Programm:

Java:
FirstFrame f1 = new FirstFrame();
Create create = new Create(f1);

...alles mehr oder weniger pseudo hingerotzt jetzt hier aber so das Prinzip. Der Vorteil von dem Interface ist dass das im Design recht dynamisch ist, du könntest jetzt recht einfach das Frame wechseln etc, das ist halt jetzt recht lose gekoppelt, auch wenn es auf den ersten Blick umständlicher scheint als wenn du einfach nur das Frame übergeben würdest 😉
Man verwendet für solche Kommunikationen halt immer am besten Interfaces, dann kann man später sehr einfach noch Dinge ändern und das erweitern. zB wenn dir später noch einfällt naja eigentlich sollen noch 4 andere Frames da drin verwickelt sein machst du bei denen einfach noch implements TreeDataListener und fertig. (Musst halt dann evtl im create frame nich nur einen Listener annehmen sondern ein Array, bzw typischerweise gibt es dann eine addXXXLIstener() Methode darin)
 
Zuletzt bearbeitet:
Danke für die Hilfe! =)

Habs jetzt so gemacht, das ich in dem ActionListener einfach den neuen Frame erstellt habe visible gesetzt hab, da dann in den ActionListener vom Save button einfach alles reingepackt und den tree und das model vom ersten mit übergeben habe... =)

funktioniert =)

...führe jetzt einfach das was ich im ersten ausgeführt wurde... im 2. aus mit den übergebenen Werten ^^
 

Das tut's immer irgendwie 😉 Man sollte den Code aber immer möglichst lose koppeln, das macht ihn dynamischer und dir die Arbeit im Endeffekt leichter. Dazu gehört auch sich zu überlegen was du eigentlich wissen willst, und vorallem was du nicht wissen willst. Dein Create-Frame da sollte nicht abhängig sein von genau diesem Tree oder Model das du gerade benutzt. Was ist, wenn dir plötzlich einfällt du willst statt nem Tree lieber ne Liste anzeigen im anderen Frame? Oder beides? Dann musste den ganzen Code im Create Frame bzw im ActionListenre des Save Buttons umschreiben. Wenn du das mit Listenern machst bleibt der Code unberührt, ist halt besser... Der Save Button sollte also nur soviel wissen, dass es ein paar Instanzen gibt, die sich für diese Änderungen interessieren. Und die versteckst du hinter einem Interface. Ob das jetzt n Tree in Frame X ist oder eine JList in FrameY, oder eine Konsolenausgabe, das hat den eigentlich nichts anzugehen 😉
 

Zurück
Oben