AWT GridBagLayout macht mir Sorgen

Furtano

Mitglied
Hi,
ich möchte in Java AWT ein GridBagLayout haben (Bitte keine Posts wie benutz doch Swing oder nutze ein anderes Layout).

Wie es sein soll, und was raus kommt seht ihr im Anhang.

Warum ist der Vertikale Abstand bei farbauszugRot2 so groß?
Liegt es am Layout ?

Java:
    /**
    *
    * GRIDBAGLAYOUT
    * ab hier
    */
    GridBagLayout gbl = new GridBagLayout();
    GridBagConstraints gbc;
    this.setLayout(gbl);
    // gridx, gridy, gridwidth, gridheight
    gbc = makegbc(0, 0, 2, 2);
    // was wenn groesse des fensters veraendert wird
    gbc.fill = GridBagConstraints.BOTH;
    gbc.anchor = GridBagConstraints.NORTH;
    gbc.weightx = bild.getWidth(null)*2;
    gbc.weighty = bild.getHeight(null)*2;
    // Constraints dem Bild zuweisen
    gbl.setConstraints(panelMainBildLinks, gbc);
    this.add(panelMainBildLinks);
     
    //--------- Roten Farbauszug hinzufuegen ---------
    gbc = makegbc(2, 0, 1, 1);
    gbc.fill = GridBagConstraints.BOTH;
    gbc.anchor = GridBagConstraints.NORTH;
    gbc.weightx = bild.getWidth(null);
    gbc.weighty = bild.getHeight(null);
    // Constraints dem Bild zuweisen
    gbl.setConstraints(farbauszugRot, gbc);
    this.add(farbauszugRot);
    //--------- Gruenen Farbauszug hinzufuegen ---------
    gbc = makegbc(3, 0, 1, 1);
    gbc.fill = GridBagConstraints.BOTH;
    gbc.anchor = GridBagConstraints.NORTH;
    gbc.weightx = bild.getWidth(null);
    gbc.weighty = bild.getHeight(null);
    // Constraints dem Bild zuweisen
    gbl.setConstraints(farbauszugGruen, gbc);
    this.add(farbauszugGruen);
    //--------- Blauen Farbauszug hinzufuegen ---------
    gbc = makegbc(4, 0, 1, 1);
    gbc.fill = GridBagConstraints.BOTH;
    gbc.anchor = GridBagConstraints.NORTH;
    gbc.weightx = bild.getWidth(null);
    gbc.weighty = bild.getHeight(null);
    // Constraints dem Bild zuweisen
    gbl.setConstraints(farbauszugBlau, gbc);
    this.add(farbauszugBlau);
    //--------- Roten Farbauszug hinzufuegen ---------
    gbc = makegbc(2, 1, 1, 1);
    gbc.fill = GridBagConstraints.BOTH;
    gbc.anchor = GridBagConstraints.SOUTH;
    gbc.weightx = bild.getWidth(null);
    gbc.weighty = bild.getHeight(null);
    // Constraints dem Bild zuweisen
    gbl.setConstraints(farbauszugRot2, gbc);
    this.add(farbauszugRot2);
 
Zuletzt bearbeitet von einem Moderator:
ich möchte in Java AWT ein GridBagLayout haben (Bitte keine Posts wie benutz doch Swing oder nutze ein anderes Layout).
Und ich mach es trotzdem. Wenn die Bilder rechts in einem gleichmässigen Gitter angeordnet werden sollen könnte man für diesen Teil einfach ein GridLayout verwenden.

Warum ist der Vertikale Abstand bei farbauszugRot2 so groß?
Das ist anhand des hier geposteten Codes nicht erkennbar. Kannst Du evtl. einen kurzen kompilierbaren und ausführbaren Code posten, der das Problem darstellt?
Java:
    gbc.weightx = bild.getWidth(null)*2;
    gbc.weighty = bild.getHeight(null)*2;
    ...
    gbc.weightx = bild.getWidth(null);
    gbc.weighty = bild.getHeight(null);
Wenn die Gewichtung einfach nur 2:1 sein soll, würde hier z.B. einfach
Code:
gbc.weightx=2
und
Code:
gbc.weightx=1
ausreichen.
Java:
     gbc = makegbc(0, 0, 2, 2);
Warum liefert makegbc ein Objekt vom Typ GridBagConstraints zurück? Wird hier jedesmal ein neues Objekt erzeugt? Ein einziges GridBagContraints ist völlig ausreichend und kann wiederverwendet werden. (Dann könnte man sich in diesem Fall auch einige Zeilen Code sparen)
Java:
         gbl.setConstraints(farbauszugRot, gbc);
    this.add(farbauszugRot);
Die Alternative in kurz wäre hierzu:
Code:
this.add(farbauszugRot, gbc);
 
Hallo Furtano,

der fragliche Abstand kann im vorliegenden Fall nicht vom Layout kommen, weil durch fill=BOTH die betroffene Komponente stets ihren ganzen Anzeigebereich füllen wird, das heißt die Zelle mit den Koordinaten x=2 und y=1 wird ganz mit der Komponente ausgefüllt, außer wenn eine Außenpolsterung benutzt wird (Insets).

Java:
import static java.awt.GridBagConstraints.*;
import java.awt.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class Testing {

    private final JPanel panelMainBildLinks;
    private final JPanel farbauszugRot;
    private final JPanel farbauszugGruen;
    private final JPanel farbauszugBlau;
    private final JPanel farbauszugRot2;

    public Testing() {
        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(400, 300);
        frame.setLocationRelativeTo(null);
        //
        GridBagLayout gbl = new GridBagLayout();
        GridBagConstraints gbc;
        JPanel mainpanel = new JPanel(gbl);
        panelMainBildLinks = new JPanel();
        panelMainBildLinks.setBackground(Color.BLACK);
        farbauszugRot = new JPanel();
        farbauszugRot.setBackground(Color.RED);
        farbauszugGruen = new JPanel();
        farbauszugGruen.setBackground(Color.GREEN);
        farbauszugBlau = new JPanel();
        farbauszugBlau.setBackground(Color.BLUE);
        farbauszugRot2 = new JPanel();
        farbauszugRot2.setBackground(Color.ORANGE);
        mainpanel.add(panelMainBildLinks, new GridBagConstraints(0, 0, 2, 2, 1.0, 1.0, NORTH, BOTH, new Insets(0, 0, 0, 0), 0, 0));
        //--------- Roten Farbauszug hinzufuegen ---------
        mainpanel.add(farbauszugRot, new GridBagConstraints(2, 0, 1, 1, 1.0, 1.0, NORTH, BOTH, new Insets(0, 0, 0, 0), 0, 0));
        //--------- Gruenen Farbauszug hinzufuegen ---------
        mainpanel.add(farbauszugGruen, new GridBagConstraints(3, 0, 1, 1, 1.0, 1.0, NORTH, BOTH, new Insets(0, 0, 0, 0), 0, 0));
        //--------- Blauen Farbauszug hinzufuegen ---------
        mainpanel.add(farbauszugBlau, new GridBagConstraints(4, 0, 1, 1, 1.0, 1.0, NORTH, BOTH, new Insets(0, 0, 0, 0), 0, 0));
        //--------- Roten Farbauszug hinzufuegen ---------
        mainpanel.add(farbauszugRot2, new GridBagConstraints(2, 1, 1, 1, 1.0, 1.0, SOUTH, BOTH, new Insets(0, 0, 0, 0), 0, 0));
        frame.add(mainpanel);
        frame.setVisible(true);
    }

    public static void main(final String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                Testing test = new Testing();
            }
        });
    }
}
Es wird empfohlen, für jede neue Komponente auch eine neues GridBagConstraints Objekt anzulegen und die Constraints nicht mit der Methode GridBagLayout.setConstraints zu übergeben, sondern mit dem vorgesehenen Parameter der Methode Container.add:
Java:
GridBagConstraints constraints = new GridBagConstraints();
...
add(component, constraints);

Gruß,
André
 
Zuletzt bearbeitet:

Zurück
Oben