Ich versuche, GridBagLayout
zu verwenden, aber ich bekomme nicht, was ich erwarte, und ich kann den Fehler in diesem Code nicht finden:
Dieses Bild zeigt, was ich brauche:
Gelb ist der Name der Schaltfläche, rot sind die Zeilen und Spalten.
Das ist was wirklich passiert:
Kann jemand erklären, was in meinem Code falsch ist?
Das Problem ist, dass nichts die zweite Gitterspalte (gridx = 1) davon überzeugen kann, eine Breite zu haben, weil es keine Komponente gibt, die nur in die zweite Spalte passen muss. Die zweite Spalte hat also eine Breite von 0, also obwohl Button1 die ersten beiden Spalten überspannt, sieht das nicht so aus, weil die gesamte Breite von der ersten Spalte erfüllt wird; und obwohl Button5 und Button7 die zweite und dritte Spalte überspannen, wird ihre gesamte Breite von der dritten Spalte erfüllt.
Um es zu reparieren, müssen Sie die Knöpfe, die breiter sein sollten (1, 5, 7), dazu bringen, mehr Platz einzunehmen. Hier habe ich diesen Buttons Padding hinzugefügt, indem ich c.ipadx = 35;
gesetzt habe. (Ich habe auch die Einschränkung weightx = 1.0
entfernt. Aus Gründen, die ich nicht ganz verstehe, hat es nicht funktioniert, als das übrig war.):
Quelle:
%Vor% Bearbeiten: Wie in den Kommentaren erwähnt, ist der obige Ansatz nicht geeignet, da er eine dynamische Größenänderung des Layouts verhindert. Damit das Layout erweitert wird, um die Größe seines Containers zu füllen, werden die Conventions weightx
und weighty
benötigt, aber die zweite Spalte erhält keine Breite.
Hier ist ein Versuch einer alternativen Lösung. Es ist ein schmutziger Hack, der eine unsichtbare Komponente am unteren Ende der zweiten Spalte einfügt, um die Breite der Spalte zu erzwingen:
%Vor%Das kommt ziemlich gut zurecht, wenn das Fenster in der Größe verändert wird. Obwohl die Komponente eine feste anfängliche Größe hat, skaliert GridBagLayout sie proportional mit den anderen Komponenten. Es ist jedoch immer noch nicht perfekt. Vielleicht gibt es eine bessere Lösung, aber ich kann es nicht finden.
Ich habe es geschafft, das benötigte Layout ohne jeglichen Hack zu erstellen und die dynamische Größenanpassung zu unterstützen, indem ich JGoodies verwendete FormLayout :
%Vor%Tags und Links java swing gridbaglayout