Hallo,
ich habe Probleme einen Container zu erstellen. Mit
Java:
Container c = f.getContentPane();
kann man ja einen Container über ein ganzes frame machen aber ich möchte Container mit einem Layoutmanager anordnen sodass ich mehere Container habe in denen ich dann objekte zum teil wieder mit dem manger anordnen kann. geht dass oder ist dass eine schlechte lösung? ich wollte halt nicht alle objekte in einem layout zusammenfassen da es sehr viele sind und in vershiedenen gruppen geordnet sind und ich dachte es wäre gut für jede gruppe einen container zu haben. hoffe auf rasche antwort.
Das Content Pane ist der Haupcontainer, in den alles reinkommt. Mit getContentPane() "machst" du den nicht, der ist schon da, du kannst ihn darüber nur abfragen. Aber ja, du kannst in diesem Content Pane wiederum andere Container schachteln. Dafür erzeugst du Instanzen von JComponent oder JPanel. Die haben auch Methoden wie setLayout() und add().
Einen Container über das ganze Frame? Mhn... mach dir eines bewusst: Ein Frame ist ein Container.
Klar kannst du Container in Container stecken und diese Teile über LayoutManager positionieren. in einer komplexen Gui sind ja nicht alle Elemente einfach auf dem Frame, sondern auf verschiedenen Panels gegliedert, gruppiert und verschachtelt...
ok danke an euch beide mir war nicht ganz klar was dass mit dem container auf sich hat ich wusste zwar dass panels oder frames container sind aber als ich dann Container c gelesen habe hab ich gedacht dass wär noch mal was anderes aber ich mach dass dann mit den panels danke...
so alles läuft soweit doch nun gibt es ein problem ich möchte ein panel in zwei gleichgroße hälfte aufteilen. in die linke kommen mehrere JComboBox untereinander in die rechte kommt eine JTable die erste combobox hat die koordinaten 0,0 in meinem layout die zweite 0,1 und so weiter die JTable at die koordinaten 1,0 sowohl die linke als auch die rechte hälfte sind eine spalte breit. nun hab ich gedacht wenn ich bei beiden weightx auf 0,5 setze sind beide gleich groß doch die rechte breitet sich aus und die linke ist ganz eng ... wie kann ich das aufteilen???
Moment mal.. Du verwendest ja scheinbar ein GridBagLayout. Und du hast eine Table und mehrere Comboboxes innerhalb dieses Layouts. Das sind insgesamt also schon mal mehr als 2 Komponenten. Was meinst du ist aus Sicht des Layout Managers die linke und rechte "Hälfte"?
nun hab ich gedacht wenn ich bei beiden weightx auf 0,5
weightx/y bestimmt übrigens nicht die Größe der Komponenten, sondern nur die Größenänderung bei Resize. Die (Initial-)Größe selbst setzt du per setPreferredSize. Du musst dir aber erstmal klar machen dass das GBL in deinem Fall nicht zwei Hälften sieht, sondern mehrere Zeilen und Spalten, also einzelne Zellen.
ja ich weiß ich hatte aber gelesen dass wenn man zwei zellen nebeneinander hat man mit weightx bei beiden mit 0,5 diese gleich breit bekommt dass stimmt wohl nicht ...
ich habe in der linken spalte 5zellen untereinander die je 1zeile hoch sind und in der rechtne spalte 1zelle die eben 5zeilen hoch ist...
ja ich weiß ich hatte aber gelesen dass wenn man zwei zellen nebeneinander hat man mit weightx bei beiden mit 0,5 diese gleich breit bekommt dass stimmt wohl nicht ...
Wie gesagt weightx bestimmt nicht die Breite der Komponenten im eigentlichen Sinn, sondern nur inwiefern sich die Breite beim Resize verändert. Aber vllt reden wir nur aneinander vorbei.. Sind die beiden Zeilen denn anfangs gleich breit? Falls nein: wie gesagt setPreferredSize auf den Komponenten. (Das stellt man nicht über die Constraints ein)
weightx 0,5 heißt dass sich die Komponenten dann neuen Platz 50/50 teilen, das ist schon korrekt. Aber wie gesagt sie müssen erstmal anfangs gleich breit sein.
ich habe jetzt an jeder erdenklichen Stelle im Code diesei setPreferredSize eingesetzt und nichts ist geschehen. dann hab ich gedacht vielleiht tuts net weil es sonst mein layout zerreisen würde... also hab ich dss mal mit setSize probiert wieder an jeder stelle und es geschah wieder nichts.. ich hatte dann vermutet, dass es an GridBagConstrais.BOTH liegen könnte hab das rausgenommen aber die compoenten bleiben gleich groß....
also die größe vom frame verändere ich nicht ... dass frame hat immer die gleiche größe aber sie spalten sind nicht gleich groß und mit setPreferedsize ändert sich auch nichts ...
Nein... du verstehst mich nicht. Sind die beiden "Hälften", wie auch immer du das definierst, beim Start des Programms d.h. der GUI gleich groß? Ja oder nein? Wenn nein - dann kann ein weightx daran auch nix ändern. Denn zuständig dafür ist setPrefferedSize. Und wenn du die damit nicht gleich groß kriegst, hast du ein grundlegendes Problem in deinem Layout..
verdammt ... dann hab ich wohl nen grundlegendes problem ... also nochmal ich habe einen frame der glecih groß bleibt. ich habe mit gridbaglayoutmanager ein layout angelegt. ich reduzier dass layout jetzt mal auf eine linke und auf eine rechte seite oder spalte oder hälfte oder wie auch immer die beim start eigentlich gleich groß sein sollten... sind sie aber nicht ... könntest du eventuell einen kleinen code posten der einfach zwei zellen nebeneinander mit setpreferredsize gleich groß macht ... vlt. mach ich ja dabei was verkehrt?
Du kannst reduzieren wie du willst, der Layout Manager tut das nicht. Der Layout Manager sieht nicht nur zwei Hälften, sondern jede einzelne Zelle im Gitter. Da müssen die Contraints aller Komponenten stimmen.
Es würde helfen wenn du mal nen Screenshot dieses Bereichs in der GUI machst und einzeichnest was du jetzt als linke und rechte Hälfte verstehst. Dann kann ich dir ganz konkret sagen welche Komponente welche Constraints und Größe haben muss.
ich hab jetzt noch mal ein kleines test layout geschrieben mit lediglich 3zellen und den erkenntnissen die du mir gebracht hast und ich muss sagen das mit setPrferredSize klappt wunderbar... ich werde wohl mein vorheriges layout nochmal überprüfen müssen
Ok. Und wg. weightx/y: Wenn du die Summe von 1 gleichmässig auf allen Komponenten verteilst werden sie beim Resize alle gleich kleiner/größer. So behälst du die Verteilung also dynamisch bei.
setPreferredSize = Initial-Größe (sofern die Verteilung auf die Zellen oder die Constraints nichts anderes sagen)
weightx/y = Größenänderung bei Resize
vielen dank für deine gedult ich hab das nun soweit verstanden jetzt gilts das ganze praktisch umzusetzen.... wegen weightx, kann es sein dass das nicht nur die aufteilung beim vergrößern bestimmt sondern auch die zelle auf die komplette breite streckt wenn noch platz ist??
Wenn das fill-Constraint entsprechend gesetzt ist: JA! Und das hat nicht nur was mit der Größe zu tun, sondern auch mit der Position. Wenn das anchor-Constraint zB mittig gesetzt ist, dann verschiebt sich die Komponente auch in die Mitte des gesamten freien Platzes, wenn du ein weight gesetzt hast.
wenn ich das richtig rausgelesen habe, willst du 2 gleichgroße Container haben?
einen für x-JComboBoxes, einen für eine JTable?
so ein Wunsch schreit förmlich nach einem GridLayout!!!
und in die JPanels p1 und p2 packst du dann mit dem entsprechenden Layout deine anderen Komponenten.
Eine vorher feststehende Anzahl von JComboboxen bspw wieder mit dem GridLayout.