layout erstellen

JAVAnnik

Bekanntes Mitglied
Hi,
ich habe ein Problem damit ein Layout für ein Programm zu erstellen. Ich möchte ein Layout erstellen das folgendermaßen aussehen soll:

Ich habe das Frame maximiert, sodass man die Taskleiste noch sieht. Nun versuche ich mit Labels und Panels mein Layout zu gestalten. Ich habe aber das Problem, dass z.B. die obere Leiste meines Programms (mit den button zum minimieren schließen...) auch mitberechnet wird und da sie auf unteschiedlichen computern unterschiedlcih breit ist kann ich keinen bestimmten wert dafür abziehen, sodass ein teil des ersten labels unter ihr verschwindet. Gibt es eine möglichkeit die position anzugeben in der die breite dieser leiste schon berücksichtig wird oder deren breite herauszufinden? Außerdem möchte ich, dass die Größen meiner Felder proportional zum bildschirm bzw. zum frame sind da die taskleiste ja noch zu dehen ist. aber wie finde ich die größe des maximierten frames heraus.

Danke schon mal im Vorraus
 
Zuletzt bearbeitet:
ich hab das nicht mit einem Layoutmanager gemacht ich hab mir das einfach im Editor zusammengebastelt womit ich aber nicht so recht zufrieden bin. kann ich in einem LAyoutmanager jedes beliebige Layout erstellen?? ich dachte da wären nur welche vorgegeben wie Grid-, oder borderlayout.
 
Na ja, es gibt halt mehrere im JDK integrierte LayoutManager, und auch noch einige externe. Diese lassen sich auch ineinander verschachteln. Damit erreicht man meistens bessere Ergebnisse, als mit dem Null-Layout, bei dem alle Komponenten direkt platziert werden.

Ich kenn mich mit den GUI-Editoren nicht so aus, aber es wäre ganz gut, wenn du den Code hier posten könntest, damit man sehen kann, ob und welcher LayoutManager benutzt wurde. Vielleicht kann dann auch eher jemand weiterhelfen, wie das gewünschte Ergebnis erzielt werden kann.
 
Bei deinem gewünschten Layout würde ich ja auf ein GridBagLayout tippen (auch wenn viele hier davon abraten und andere externe LayoutManager bevorzugen). Mit dem GridBagLayout legst du deine Komponenten in einem Raster an, kannst Zellen verbinden, die Grösse von Spalten und Zeilen bestimmen. Ist halt nicht ganz so einfach, aber wenn man sich da mal weiter reingearbeitet hat, dann kriegt man da auch brauchbare Ergebnisse hin.
 
ich habe da null-Layout verwendet und anhand der bildschirmgröße (screensize) die absolute Position und größe ermittelt. nun möchte ich das aber mit einem layoutmanager machen. Ich denke hier bietet sich das Grid-Layout an oder?
Ich hab jedoch keine erfahrung mit Layoutmanagern und wer djetzt mal ein wenig herumprobieren wie ich damit zurechtkomme.
 
Ich denke hier bietet sich das Grid-Layout an oder?
Bei einem GridLayout hast du auch ein Raster, aber alle Zellen sind gleich gross. Wenn du dein Fenster grösser ziehst, dann ändert sich die Grösse der Zellen auch proportional mit. Aber die Zellen haben trotzdem immer die gleiche Grösse/Proportion. Beim GridBagLayout kannst du die Zellen (Spalten/Zeilen) unterschiedlich festlegen, und auch Zellen miteinader verbinden. Schau mal hier: http://www.java-forum.org/java-faq-beitraege/109289-vorstellung-layoutmanager-standard-java-api.html - eine Übersicht über die LayoutManager.
 
danke für den link hab vorhin schnell mal alles überflogen und gridlayout und gridbaglayout in einen topf geworfen. gut dann weiß ich nach was ich suchen muss ... danke
 
Hat das überhaupt mit Layout zu tun, oder war die Frage, wie man einen Frame auf die Fenstergröße bringt? (Falls ja: GraphicsConfiguration (Java 2 Platform SE 5.0) ). Ansonsten sollte man sich um irgendwelche Betriebssystem- und L&F-spezifischen Größen nicht so viele Gedanken machen müssen...

Eigentlich waren das zwei fargen: einmal die nach dem layout und die die du meinst.
Wie man ihn auf Fenstergröße bekommt weiß ich ich wollte nur wissen wie ich dann die framegröße herrausfindet weil ich gelesen hab wenn man es mit diesem befehl macht: setExtendedState(MAXIMIZED_BOTH); könnte man die größe des frames nicht mehr herausfinden.
 
Hmja, vom Null-Layout war nicht direkt die Rede, aber von der Taskleiste... ???:L Es klingt wirr...
@JAVAnnik Poste am besten mal ein Stück code...
 
@JAVAnnik Poste am besten mal ein Stück code...

Ich hab so gut wie keinen code da ich wusste das diese probleme auftreten ich aber nicht wusste wie ich sie lösen kann. mit dem gridbaglayout scheinen alles probleme gelöst zu sein ich hab das oben skizzirte layout mal mit dem layoutmanager erstellt und es schein alles so weit zu funktionieren. vielen dank :toll::applaus:
 
so ich hab nun doch noch eine frage ich habe einen code gefunden fürs gridbaglayout und wollte ihn dahin gehend verändern, dass das layout beim maximieren so aussieht wie die skizze oben. nun habe ich aber noch ein problem und zwar passen sich die unteren zwei zeilen irgendwie immer aneinander an ich hab schon rumprobiert aber nie schaut das so bei mir aus wie oben in der skizze was hab ich falsch gemacht???
ich vermute es liegt vlt. an zeile 42 da war ich mir nicht im klaren was ich dort genau reinschreiben muss.

hier mal der code:
Java:
import java.awt.*;
 import java.util.*;
 import java.applet.Applet;

 public class GridBagEx1 extends Applet {

     protected void makebutton(String name,
                               GridBagLayout gridbag,
                               GridBagConstraints c) {
         Button button = new Button(name);
         gridbag.setConstraints(button, c);
         add(button);
     }

     public void init() {
         GridBagLayout gridbag = new GridBagLayout();
         GridBagConstraints c = new GridBagConstraints();

         setFont(new Font("Helvetica", Font.PLAIN, 14));
         setLayout(gridbag);

         c.fill = GridBagConstraints.BOTH;
         c.weightx = 0.0;
         c.weighty = 0.0;
         makebutton("        ", gridbag, c);
         makebutton("        ", gridbag, c);

         c.gridwidth = GridBagConstraints.REMAINDER; //end r
         c.weightx = 1.0;
         makebutton("", gridbag, c);


         c.weightx = 0.0;      //reset to the default
         c.weighty = 5.0;
         makebutton("", gridbag, c); //another row


         c.weightx = 0.0;      //reset to the default
         c.weighty = 0.0;
         makebutton("", gridbag, c); //another row

         c.gridwidth = 4;
         c.weightx = 1.0;
         c.weighty = 0.0;
         makebutton("", gridbag, c);
         makebutton("", gridbag, c);
         makebutton("", gridbag, c);
         c.gridwidth = GridBagConstraints.REMAINDER; //end row
         makebutton("", gridbag, c);


         c.gridwidth = GridBagConstraints.RELATIVE;
         c.weighty = 4.0;
         c.weightx = 1.0;
         makebutton("", gridbag, c);
         c.weightx = 4.0;
         makebutton("", gridbag, c);

     }

     public static void main(String args[]) {
     Frame f = new Frame("GridBag Layout Example");
     GridBagEx1 ex1 = new GridBagEx1();

     ex1.init();

     f.add("Center", ex1);
     f.pack();
     f.setSize(300,200);
     f.show();
     }
}
 
Hab ich das nur übersehen, oder hast du nirgendwo gridx und gridy für deine Komponenten festgelegt? Weil damit bestimmst du, wo in das Koordinatensystem die Komponenten reingelegt werden.

Zu Zeile 42: gridwidth bestimmt, über wieviele Spalten deines Gitters die Zelle gehen soll, in der diese Komponente liegt. Wenn du da 4 angibst, dann werden 4 Zellen horizontal miteinander verbunden.
 
ok ich hab jetzt folgendes geschrieben und das klappt (hab die buttons in farbige labels eingetauscht):

Java:
c.gridwidth = 1;
         c.weightx = 1.0;
         c.weighty = 0.0;
         makelabel(Color.BLUE, gridbag, c);
         makelabel(Color.GRAY, gridbag, c);
         makelabel(Color.ORANGE, gridbag, c);
         c.gridwidth = GridBagConstraints.REMAINDER; //end row
         makelabel(Color.PINK, gridbag, c);


         c.gridwidth = 1;
         c.weighty = 4.0;
         makelabel(Color.CYAN, gridbag, c);
         c.gridwidth = 3;
         makelabel(Color.BLACK, gridbag, c);

ich verstehe nur nicht warum es einmal gridwidth gibt welches angibt über wie viele spalten eine zele gehen soll und einmal weigthx das glaube ich zumindest das Verhältnis in der breite angibt, außerdem ist mir nicht klar warum sich die einzelnen zeilen gegenseitig beeinflussen ich dachte jede zeile wäre für sich und in jeder zeile könnte man das verhältnis der zellen einstellen. doch stelle ich ein verhältniss ein beeinflusst das auch die darüber liegende zeile???:L???:L
 
Die Größe einer einzelnen Zelle richtet sich primär nach der PreferredSize (respektive MinimumSize) der in ihr liegenden Komponente. Wenn die Größe des Containers die benötigte Größe über- oder unterschreitet, bestimmt das Gewicht (weightx, weighty), in welchem Verhältnis zueinander die Zellen verkleinert/vergrößert werden.
http://www.java-forum.org/bilder-gui-damit-zusammenhaengt/64702-gridbaglayout.html

Ja, ich glaube weightx und weighty sind die kompliziertesten Werte beim GridBagLayout. Soweit ich das verstanden habe, bestimmen sie die Verteilung des restlichen Platzes und das Verhalten bei der Grössenveränderung des Frames. Normalerweise bewegen sich die Werte zwischen 0.0 und 1.0. Wenn alle Komponenten auf 0.0 gesetzt sind (sowohl weightx als auch weighty), dann ist das Gitter mit allen Zellen zentriert in der Mitte. Ich setz meistens bei der letzten hinzugefügten Komponente die Werte auf 1.0.
 
ok also sollte man eigentlich hauptsächlich mit gridx,gridy,gridwidth und heigth arbeiten!?
kann man also wenn ich zb. zwei zellen nebeneinander habe die eine sollt immer gleich groß sein und die andere die größe verändern, nehme ich für die erste dann gridwidth und für die zweite weigthx???
 
ok also sollte man eigentlich hauptsächlich mit gridx,gridy,gridwidth und heigth arbeiten!?
Na ja, das sind halt die Angaben, in welche Zellen in deinem Gitter deine Komponenten gelegt werden und ob die Zellen über mehrere Zeilen oder Spalten zu einer zusammengefasst werden (ähnlich dem span bei Tabellen in HTML). Das sind halt erstmal die wichtigsten Angaben, um deinem Layout eine Grundstruktur zu geben, wo deine Komponenten angeordnet werden und wie das Gitter aufgeteilt ist.


kann man also wenn ich zb. zwei zellen nebeneinander habe die eine sollt immer gleich groß sein und die andere die größe verändern, nehme ich für die erste dann gridwidth und für die zweite weigthx???
gridtwidth nimmst du ja nur, wenn eine Zelle über mehrere Spalten gehen soll.
 
Du kannst auch ein Gitter mit 3 Spalten anlegen und über gridx/gridy die 3 Komponenten in die 3 Zellen hinzufügen. Mit gridx=0 und gridy=0 nimmst du die 1. Zelle (oberste Zeile, 1. Spalte) usw.
 
... zwei zellen nebeneinander habe die eine sollt immer gleich groß sein und die andere die größe verändern, nehme ich für die erste dann gridwidth und für die zweite weigthx???

dann bekommt die Zelle, die immer gleich groß bleiben soll "
Code:
weightx=0.0;
und die andere [c]weightx=1.0[/c]
 
Ich denke mal, das lässt sich mit einer Kombination aus verschiedenen LayoutManagern vieleicht in Verbindung mit JSlitPanes eleganter Lösen.
Dadurch bekäme der User noch die Möglichkeit, den für Ihn wichtigen Bereich je nach Bedarf aufzuziehen.

GrußVanny
 

Neue Themen


Zurück
Oben