Hallo, ich möchte das GridBagLayout einführen, weil ich dann, denke ich, mit weniger JPanel auskomme… Es soll genau so aussehen wie bei dem folgendem Code und das Resize behaviour soll auch gleich sein:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.WindowConstants;
public class GridBagLayoutTest {
public static class MyBar {
JProgressBar bar = new JProgressBar();
JLabel text = new JLabel("irgendwas", JLabel.CENTER);
JPanel panel = new JPanel(new BorderLayout());
public MyBar() {
panel.add(bar, BorderLayout.CENTER);
panel.add(text, BorderLayout.EAST);
text.setPreferredSize(new Dimension(175, text.getPreferredSize().height));
}
}
private JFrame frame = new JFrame("Version 1");
private JPanel panel1 = new JPanel();
private List<MyBar> bars = new ArrayList<>();
public GridBagLayoutTest() {
for (int i = 0; i < 4; i++) {
bars.add(new MyBar());
}
frame.setLayout(new BorderLayout());
panel1.setLayout(new GridLayout(bars.size(), 1));
for (MyBar myBar : bars) {
panel1.add(myBar.panel);
}
frame.add(panel1, BorderLayout.NORTH);
frame.setSize(800, 600);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public static void main(String[] args) {
new GridBagLayoutTest();
}
}
Hätte dafür jemand einen Ansatz? Ich kapiere das GridBagLayout nicht: https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html
Das GridBagLayout hat ein paar versteckte Problemchen, ich hantiere inzwischen lieber mit verschachtelten BorderLayouts und GridLayouts. Wenn man jeden Panel in seiner eigenen Methode erstellt und diese ordentlich benennt, bleibt das meiner Erfahrung nach auch übersichtlich und gut wartbar.
Ok, ich hatte früher mal einen Prof, der wollte in einer Prüfung, dass das GridBagLayout eingesetzt wird. Dabei ging es um Swing und eine UI. Ich hab dann eine identisch aussehende UI auch mit dem BorderLayout und JPanel gebastelt, und für diese Teilaufgabe 0 Punkte bekommen. Damals war mit aber noch nicht bewusst, dass das GridBagLayout „unsinnig“ ist… Ich hätte mich beschweren können, tat ich aber nicht. Danke für eure Antworten. Edit: Hatte die Prüfung trotzdem bestanden.
Gut, dann hat sich das ja erledigt. Ich hatte schon befürchtet, dass einer der alten Swinger sich hier jetzt Mühe gibt, nur um von dir dann Beschwerden zu hören, dass irgendein Pixel am Ende doch die falsche Farbe hat.
Aber kurz: Es gibt eine Sache, die (wie ich finde) nicht gut mit den eingebauten Layouts nachbildbar ist (und nur dafür eine neue dependency reinziehen ist auch blöd), nämlich ein einfaches n-spaltiges Layout mit unterschiedlich breiten Spalten:
[Some Button ] [ Some text Field ] [Checkbox]
[Some Button with long text] [ Another Text Field ] [Checkbox]
[Short ] [ Yet Another Text Field ] [Checkbox]
Deswegen hatte ich mir nur für diesen Zweck mal eine GridBagLayouts-Klasse erstellt, mit der man sowas recht leicht zusammenbasteln kann (und die intern ein einfaches (!) GridBagLayout verwendet).
Ehhh, dumme Frage, aber wie binde ich das denn ein? Und wäre es lizenztechnisch erlaubt, dass ich Teile deiner GridBagLayouts Klasse einfach kopiere, oder ist dann Polen offen?
In JEDER meiner -java-Dateien auf GitHub ist der MIT-Header. Aber hiermit erkläre ich die GridBagLayouts-Klasse offiziell als „Public Domain“, oder alternativ, veröffentliche sie hier nochmal unter der WTFPL. (Aber nur diese GridBagLayouts-Klasse. Bei anderen Klassen steckt einiges an Arbeit drin…)
Das meinte ich doch. Es soll nicht unhöflich klingen, aber ich brauche zurzeit eh nur diese eine Klasse (bzw. TEILE der Klasse ), und b) ich hätte ohnehin nicht die komplette Library kopiert… Danke!
Ich weiss ich weiss die Frage hier ist über Swing, aber in JavaFX ist das mit dem GridPane in 15 Sekunden gemacht und ich verkneif mir den Kommentar jetzt schon seit ein paar Tagen.
@L-ectron-X
Das ist wirklich außerordentlich gut geschrieben, wenn du mir das Kompliment erlaubst