Welches Layout am besten für dieses Layout ?

Hallo,

ich kenne alle Swing gängigen Layouts und habe so gut wie alle schonmal irgendwo benutzt. Dennoch frage ich mich wie ich das Layout am besten umsetze. MigLayout will ich eigentlich ungern benutzen, da ich meine Applikation nicht unnötig mit externen Libs vollstopfen will.

Im Moment habe ich erstmal alle Komponenten auf den Panel gehauen mit dem Standard FlowLayout, siehe hier:

Am Ende soll das ganze ungefähr so aussehen: (ich weiß sehr stark aber ich habe hier im Moment nicht wirklich andere Mittel, um das zu zeichnen und es musste schnell gehen :D, aber ich denke es ist ersichtlich wie es grob aussehen soll):

Wie meint ihr löst man das am besten ? Großer GesamtPanel: BoxLayout und in den ersten beiden Panels auch BoxLayout und dann im unteren dritten Panel GridBagLayout ?

Viele Grüße

Anhand der Zeichnung schwer zu erkennen. So grob:

BoxLayout
    JCheckBox
    GridLayout
        JCheckBox
        ...
    GridLayout
        JCheckBox
        ...
    evtl. GridBagLayout

Bastel dir erstmal die drei Kästchen (je ein Panel mit Layout) zusammen und pack die dann in ein BoxLayout.

Ok habe das soweit angepasst, hier mal ein KSKB:
Das Problem: Die erste Checkbox ist noch nicht ganz links trotz setAlignmentX und Component.LEFT_ALIGNMENT.
Und der untere 3.Panel sieht noch nicht so aus wie ich das gerne hätte.
Wenn ich ein JFrame.pack(); aufrufe klappt das wenigstens für den 3.Panel (siehe KSKB) aber in meinem eigentlichen Programm ist das keine Option.
Muss ich also mit setPrefferedSize arbeiten, um den dritten Panel richtig anzuzeigen ?
Und wie bekomme ich die erste Checkbox nach ganz links ?

*** Edit ***

Ok die oberste Checkbox konnte ich nach links verschieben, indem ich die JCheckBox einem JPanel hinzugefügt habe mit dem GridLayout(1,1);
Momentan sieht es so aus:

Wenn ich es jetzt noch schaffe die Höhe des letztens Panels anzupassen und die Komponenten in diesem Panel links anzuordnen, dann wäre es perfekt.

*** Edit 2 ***
Durch Box.createRigidArea() konnte ich nun die GUI wie unten zu sehen anpsasen. Nun müssten nur noch die Komponente innerhalb des JPanels sich links anordnen. Ich schätze da muss ich noch das GridBagLayout des JPanels ein wenig ändern…

das GridBagLayout nimmt nach oben (äußere Layouts) soviel Platz ein wie möglich
(wenn es nicht dabei wäre, dann die anderen, mit allen drei ist das GridBagLayout am ‘erfolgreichsten’)
und nach innen zentriert es standardmäßig

das innere Problem könntest du lösen, wenn du den restlichen Platz mit sonstigen unbekannten Komponenten auffüllst,

waagerecht geht hier auch, die Zelle des Speichern-Button auf volle restliche Breite aufzufüllen, den Button selber aber nur links anzuordnen

        JButton shortcutButton = new JButton("Speichern");
        shortcutButton.setEnabled(false);

        c.gridx = 2;
        c.anchor = GridBagConstraints.WEST;
        c.fill = GridBagConstraints.NONE;
        c.weightx = 1;
        advancedPanel.add(shortcutButton, c);

c.weighty = 1: würde auch nach unten füllen, die Komponenten nach oben drücken,
aber Textfeld daneben sieht dann nicht gut aus, lieber neue Zeile darunter, leere JLabel sind unsichtbar

zum äußeren Problem evtl. auch wieder ein GridBagLayout und unten eine unsichtbare Komponente mit rein

Wieso setzt Du die Orientierung der untern Panels auf Component.CENTER_ALIGNMENT? Das beeinflusst die Ausrichtung der JCheckBox oben drüber. Setzte diese doch auf LEFT_ALIGNMENT, dann kann man die JCheckBox direkt einsetzen.

Bzgl. Höhe das ganze eventuell noch in ein BorderLayout ( NORTH ) setzen, das BoxLayout die gesamte verfügbare Fläche einnimmt. Links ausrichten sollte doch mit GridBag gehen.

Danke an slaterB habe es jetzt hinbekommen :slight_smile:

Musst du das ganze in einer Wurst runtercoden? Du hast doch 3 ganz klar abgetrennte Bereiche. Sowas ist doch nicht lesbar dabei wärs so leicht zu strukturieren.

Nein natürlich nicht, Steht auch ganz oben auf meiner Todo : Schöneren Code und Strukturierung. Ich habe das schon teilweise angefangen, indem ich Methoden wie createSidebarPanel, createTabbedPane, createDetailPanel, createTablePanel, createBottomBarPanel … habe. Jetzt im nächsten Schritt werde ich mich darum kümmern, dass auch in den kleinen Untereinheiten nocheinmal zu strukturieren. Woran ich gerade ein wenig verzweifle sind die ActionListener.
Schreib ich für jeden Button einen neuen ActionListener aka



button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
}
});

dann erstelle ich a) jedesmal einen neuen ActionListener und b) macht das den code so unglaublich “lang” weil das immer einige Zeilen kostet.

Erbe ich von ActionListener und greife auf die Button per ActionCommand zu habe ich jedesmal die equals Abfrage und zusätzlich eine ellenlage actionPerformed Methode.
Nehme ich einen ActionListener als anonyme Klasse ist das auch nicht viel anders…