Positionieren von Elementen in GridBagLayout

CptK

Bekanntes Mitglied
Hallo zusammen, ich habe folgenden Code:
Java:
private final Dimension size = new Dimension(250, 300);

private final String title = "Add Point";

private JLabel[] labels;
private String[] labelNames = { title, "x", "y", "z" };
private JTextField[] inputFields;
private JButton addButton;

public AddPointFrame(int dimenion) {
    labels = new JLabel[labelNames.length];
    inputFields = new JTextField[3];

    setPreferredSize(size);
    setResizable(false);
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    GridBagLayout layout = new GridBagLayout();
    GridBagConstraints gbc;
    setLayout(layout);

    // header
    labels[0] = new JLabel(labelNames[0]);
    labels[0].setFont(new Font("Arial", 5, 20));
    GridBagConstraints gbcHeader = makegbc(0, 0, 2, 0);
    gbcHeader.anchor = GridBagConstraints.NORTH;
    gbcHeader.insets = new Insets(0, 20, 30, 20);
    layout.setConstraints(labels[0], gbcHeader);
    add(labels[0]);

    for (int i = 1; i < dimenion + 1; i++) {
        // Label
        gbc = makegbc(0, i, 1, 1);
        gbc.insets = new Insets(20, 40, 0, 0);
        labels[i] = new JLabel(labelNames[i]);
        layout.setConstraints(labels[i], gbc);
        add(labels[i]);

        // Text-field
        gbc = makegbc(1, 1, 1, 1);
        gbc.weightx = 100;
        gbc.insets = new Insets(20, 20, 0, 40);
        gbc.fill = GridBagConstraints.HORIZONTAL;
        inputFields[i - 1] = new JTextField();
        layout.setConstraints(inputFields[i - 1], gbc);
        add(inputFields[i - 1]);
        System.out.println(i - 1);
    }

    // Ende-Button
    addButton = new JButton("Add");
    addButton.setPreferredSize(new Dimension(size.width / 2, 20));
    gbc = makegbc(0, 4, 2, 0);
    gbc.insets = new Insets(40, 20, 40, 20);
    layout.setConstraints(addButton, gbc);
    add(addButton);

    pack();

    setVisible(true);
    repaint();
}

private GridBagConstraints makegbc(int x, int y, int width, int height) {
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.gridx = x;
    gbc.gridy = y;
    gbc.gridwidth = width;
    gbc.gridheight = height;
    return gbc;
}

Für dimension = 1,2,3 bekomme ich nun folgende Ergebnisse (andere Dimensionen sind nicht vorgesehen, das Handling dafür kommt noch):
1614007528622.png1614007561327.png1614007594724.png
Direkt fällt natürlich auf, dass der immer nur ein JTextfield anzeigt, obwohl mehrere da sein sollten, ich verstehe aber nicht, wieso das nicht gemacht wird.
Außerdem habe ich ein paar Probleme beim anordnen der Komponenten: Der Titel soll bei allen auf der Höhe sein, auf der er bei dimension = 3 ist. Der Button soll bei allen auf der selben Höhe sein und zwar ungefähr seine jetzige Position bei dimension = 3 minus seiner Höhe und die Labels + dazugehörige TextFields sollen zwischen Header und Button horizontal zentriert werden.
 

LimDul

Top Contributor
Bezüglich der vertikalen Anordnung. Du setzt nirgendwo weighty. Das führt dazu, dass der verbleibende Platz, den die Komponenten nicht brauchen gleichmäßig oben und unten ergänz wird
Unless you specify at least one non-zero value for weightx or weighty, all the components clump together in the center of their container. This is because when the weight is 0.0 (the default), the GridBagLayout puts any extra space between its grid of cells and the edges of the container.
Das heißt, du musst du überlegen, welche Komponente wie den Platz zugeschlagen bekommt (z.B. bei der obersten mit dem Label weighty setzen)
 

CptK

Bekanntes Mitglied
So ich habe die Sachen mal versucht umzusetzen:
Java:
// header
labels[0] = new JLabel(labelNames[0]);
labels[0].setFont(new Font("Arial", 5, 20));
GridBagConstraints gbcHeader = makegbc(0, 0, 2, 0);
gbcHeader.anchor = GridBagConstraints.NORTH;
gbcHeader.insets = new Insets(0, 20, 50, 20);
gbcHeader.weighty = 20;
layout.setConstraints(labels[0], gbcHeader);
add(labels[0]);

for (int i = 1; i < dimension+ 1; i++) {
    // Label
    gbc = makegbc(0, i, 1, 1);
    gbc.anchor = GridBagConstraints.CENTER;
    gbc.weighty = 60 / dimension;
    gbc.fill = GridBagConstraints.VERTICAL;
    gbc.insets = new Insets(20, 40, 0, 0);
    labels[i] = new JLabel(labelNames[i]);
    layout.setConstraints(labels[i], gbc);
    add(labels[i]);

    // Text-field
    gbc = makegbc(1, i, 1, 1);
    gbc.anchor = GridBagConstraints.CENTER;
    gbc.weightx = 100;
    gbc.weighty = 60 / dimension;
    gbc.insets = new Insets(20, 20, 0, 40);
    gbc.fill = GridBagConstraints.HORIZONTAL;
    inputFields[i - 1] = new JTextField();
    layout.setConstraints(inputFields[i - 1], gbc);
    add(inputFields[i - 1]);
}

// Ende-Button
addButton = new JButton("Add");
addButton.setPreferredSize(new Dimension(size.width / 2, 20));
gbc = makegbc(0, 4, 2, 0);
gbc.weighty = 20;
gbc.insets = new Insets(40, 20, 40, 20);
layout.setConstraints(addButton, gbc);
add(addButton);

es sieht auch schon wesentlich schöner aus:
1614012687802.png
Wenn ich jetzt aber versuche dem Header noch einen Margin zu geben, also sowas wie
Java:
gbcHeader.insets = new Insets(20, 20, 20, 20);
macht der das nicht so, wie es sein sollte:
1614012799051.png
 

mihe7

Top Contributor
Wenn ich Dich richtig verstehe, willst Du etwas wie (Achtung: es folgt quick & dirty-Code):

Java:
import java.awt.*;
import javax.swing.*;

public class Test {

    public void run() {
        String[] labels = {"Add Point", "x", "y", "z"};

        Insets labelInsets = new Insets(5,20,5,5);
        Insets fieldInsets = new Insets(5,0,5,20);

        JPanel panel = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();

        gbc.fill = GridBagConstraints.HORIZONTAL;

        for (int i = 1; i < labels.length; i++) {
            JLabel label = new JLabel(labels[i]);
            gbc.gridy = i;
            gbc.gridx = 0;
            gbc.weightx = 0;
            gbc.insets = labelInsets;
            panel.add(label, gbc);

            gbc.gridx = 1;
            gbc.weightx = 1;
            gbc.insets = fieldInsets;
            panel.add(new JTextField(30), gbc);
        }

        JLabel header = new JLabel(labels[0]);
        header.setFont(header.getFont().deriveFont(20f));
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.gridwidth = 2;
        gbc.fill = GridBagConstraints.NONE;
        gbc.anchor = GridBagConstraints.PAGE_END;
        gbc.insets = new Insets(20,0,20,0);
        panel.add(header, gbc);

        JButton button = new JButton("Add");
        gbc.gridx=0;
        gbc.gridy=labels.length;
        gbc.gridwidth=2;
        gbc.weighty=1;
        gbc.anchor = GridBagConstraints.PAGE_START;
        panel.add(button, gbc);        


        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().run());
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Probleme beim positionieren von Elementen AWT, Swing, JavaFX & SWT 2
EinNickname9 Swing Button mittig positionieren AWT, Swing, JavaFX & SWT 4
R Textfield lässt sich nicht positionieren AWT, Swing, JavaFX & SWT 1
B JTextField in Panel positionieren AWT, Swing, JavaFX & SWT 1
J Panel auf Frame positionieren AWT, Swing, JavaFX & SWT 9
J JavaFX Rectangle innerhalb eines Rectangle oder Panes positionieren? AWT, Swing, JavaFX & SWT 1
L ComboBox: slider positionieren AWT, Swing, JavaFX & SWT 0
TheJavaKid JavaFX Elemente positionieren AWT, Swing, JavaFX & SWT 2
W Swing Größenänderung vom JPanel im JScrollPane und anschließendes positionieren AWT, Swing, JavaFX & SWT 2
P Buttons/Labels auf GUI positionieren AWT, Swing, JavaFX & SWT 2
G Mehrere Strings um Kreis zeichnen und positionieren AWT, Swing, JavaFX & SWT 0
F AWT JFrame Mittig Positionieren bei 2Bilschirmen AWT, Swing, JavaFX & SWT 6
L Swing Button in GridBackLayout positionieren und TitleBorder pro Spalte hinzufügen AWT, Swing, JavaFX & SWT 9
J Swing JFrames positionieren AWT, Swing, JavaFX & SWT 4
H Label mit Icon positionieren AWT, Swing, JavaFX & SWT 14
J Swing JLabel positionieren AWT, Swing, JavaFX & SWT 6
D Mehrere JTabel in einem Frame positionieren AWT, Swing, JavaFX & SWT 5
V JFrame in JPanel positionieren AWT, Swing, JavaFX & SWT 5
N Swing Layout positionieren AWT, Swing, JavaFX & SWT 2
F Swing JLabel positionieren AWT, Swing, JavaFX & SWT 2
I Swing Positionieren von Panels mit layoutManager AWT, Swing, JavaFX & SWT 6
F Problem beim Positionieren von Icon und Text in Button AWT, Swing, JavaFX & SWT 2
S AWT Wie kann ich Text horizontal exakt positionieren? AWT, Swing, JavaFX & SWT 3
L JFreeChart - Legende beliebig positionieren AWT, Swing, JavaFX & SWT 16
F JButton in JFrame positionieren AWT, Swing, JavaFX & SWT 1
P JPanel: LayoutManager und trotzdem absolut positionieren? AWT, Swing, JavaFX & SWT 3
M Wie Scrollbalken links positionieren? AWT, Swing, JavaFX & SWT 14
D Frames positionieren (java.awt.Frame) AWT, Swing, JavaFX & SWT 3
P JFrame/JWindow in der Mitte des Bildschirms positionieren AWT, Swing, JavaFX & SWT 4
G Komponente oben positionieren (BorderLayout) AWT, Swing, JavaFX & SWT 3
G JLabel positionieren AWT, Swing, JavaFX & SWT 12
W Komponente punktgenau positionieren AWT, Swing, JavaFX & SWT 2
H jLabel auf jPanel FEST positionieren AWT, Swing, JavaFX & SWT 2
M Bilder frei positionieren? AWT, Swing, JavaFX & SWT 29
C Positionieren von Objekten AWT, Swing, JavaFX & SWT 11
P [SWT] FileDialog unsichtbar machen bzw. positionieren AWT, Swing, JavaFX & SWT 8
M Grafik flexibel an berechneten Koordinaten positionieren AWT, Swing, JavaFX & SWT 4
S JTextField ohne LayoutManager positionieren AWT, Swing, JavaFX & SWT 3
H 2 Images positionieren AWT, Swing, JavaFX & SWT 9
B Cursor zentriert in ein Textfeld positionieren AWT, Swing, JavaFX & SWT 2
N TextArea positionieren AWT, Swing, JavaFX & SWT 3
E JDialog positionieren AWT, Swing, JavaFX & SWT 7
M .exe Datei positionieren AWT, Swing, JavaFX & SWT 2
S Buttons positionieren AWT, Swing, JavaFX & SWT 3
S Awt- und Swing-Steuerelemente absolut positionieren AWT, Swing, JavaFX & SWT 3
I ToolTipText genau positionieren AWT, Swing, JavaFX & SWT 2
M Buttons positionieren... AWT, Swing, JavaFX & SWT 4
D Layout einer scene mit ListView Elementen und Zwei Textfeldern AWT, Swing, JavaFX & SWT 1
TheWhiteShadow JavaFX ListView Problem beim Entfernen von Elementen AWT, Swing, JavaFX & SWT 1
G ObjectOutPutStream mit Javafx GUI Elementen AWT, Swing, JavaFX & SWT 14
N Array mit JavaFX Elementen AWT, Swing, JavaFX & SWT 9
RalleYTN Modaler Dialog und JTree Node mit sehr... seeeeehr vielen Elementen AWT, Swing, JavaFX & SWT 6
T Probleme mit Anzeige von Elementen im JPanel AWT, Swing, JavaFX & SWT 1
K Automatische Skalierung von GUI Elementen (Java Swing) AWT, Swing, JavaFX & SWT 2
B Linie zwischen 2 Elementen AWT, Swing, JavaFX & SWT 5
D Anordnung von Elementen in JFrame AWT, Swing, JavaFX & SWT 2
T Swing Kombination von GUI-Elementen - Was mit wem ist erlaubt? AWT, Swing, JavaFX & SWT 12
B Swing Formular mit mehreren Elementen - wie die ActionListener-Verarbeitung lösen? AWT, Swing, JavaFX & SWT 2
S Shape erstellen der aus mehreren Elementen besteht..? AWT, Swing, JavaFX & SWT 3
G Swing MigLayout: Lücken zwischen Elementen entfernen AWT, Swing, JavaFX & SWT 2
K JList-Probleme beim Hinzufügen von Elementen AWT, Swing, JavaFX & SWT 3
N JFrame mit Elementen an die Bildschirmgröße automatisch anpassen AWT, Swing, JavaFX & SWT 3
U Swing JScrollPane + Panel drinne mit weiteren Elementen AWT, Swing, JavaFX & SWT 2
I Swing JPanel Tab zwischen GUI Elementen AWT, Swing, JavaFX & SWT 6
F JList füllen mit LinkedList-Elementen AWT, Swing, JavaFX & SWT 21
Strahlungsleck Swing Positionierung von Elementen im GridBagLayout AWT, Swing, JavaFX & SWT 2
Strahlungsleck Problem mit dem Anzeigen von Elementen im BorderLayout AWT, Swing, JavaFX & SWT 6
G JDialog mit mehreren Elementen! AWT, Swing, JavaFX & SWT 5
R Fokus von GUI-Elementen AWT, Swing, JavaFX & SWT 3
G Fixieren von Elementen in einem GridBayLayout AWT, Swing, JavaFX & SWT 4
D Hilfe bei GUI-Elementen in Java AWT, Swing, JavaFX & SWT 9
G Swing mit nativen (oder nativ aussehenden) Elementen AWT, Swing, JavaFX & SWT 4
D Freigabe von SWT Elementen AWT, Swing, JavaFX & SWT 2
W SWT, Anordung von Elementen - Layout Problem ? AWT, Swing, JavaFX & SWT 2
J JInternalFrame überlagert/unterlagert anderen Elementen AWT, Swing, JavaFX & SWT 2
B Abstand zwischen einzelnen Elementen einstellen AWT, Swing, JavaFX & SWT 2
M in JList nur Attribute von Elementen anzeigen lassen AWT, Swing, JavaFX & SWT 4
P Eventmanagement bei überlappenden Swing Elementen AWT, Swing, JavaFX & SWT 3
R Anfängerfrage:anzeige von Gui elementen AWT, Swing, JavaFX & SWT 2
G Ungewollter Abstand zwischen Gui -Elementen / Insets setzen AWT, Swing, JavaFX & SWT 2
S GridBagLayout Felder formatieren AWT, Swing, JavaFX & SWT 1
S GridBagLayout - Probleme mit Bilderanzeige AWT, Swing, JavaFX & SWT 3
C GridbagLayout verstehen lernen AWT, Swing, JavaFX & SWT 1
H GridBagLayout macht mich wahnsinnig :-( AWT, Swing, JavaFX & SWT 5
BabySuna darstellungsprobleme mit JTabbedPane und GridBagLayout AWT, Swing, JavaFX & SWT 8
A Probleme mit gridheight (GridBagLayout) AWT, Swing, JavaFX & SWT 6
Mario1409 AWT GridBagLayout AWT, Swing, JavaFX & SWT 5
J LayoutManager GridBagLayout, probleme mit Anordnung von Objekten AWT, Swing, JavaFX & SWT 6
DaCrazyJavaExpert Swing Komponenten in GridBagLayout werden Falsch angeordnet AWT, Swing, JavaFX & SWT 1
T LayoutManager Anordnen der Elemente im GridBagLayout AWT, Swing, JavaFX & SWT 11
K GridBagLayout mit reponsive Design AWT, Swing, JavaFX & SWT 2
K GridBagLayout verändert die größe? AWT, Swing, JavaFX & SWT 1
D Swing Größe einer JComboBox im GridBagLayout aufgrund der maximalen Länge der enthaltenen Daten AWT, Swing, JavaFX & SWT 7
B LayoutManager GridBagLayout und JScrollPane AWT, Swing, JavaFX & SWT 5
T GridBagLayout Anfängerprobleme AWT, Swing, JavaFX & SWT 3
Sin137 LayoutManager GridBagLayout Probleme AWT, Swing, JavaFX & SWT 6
L GridBagLayout Anordnung AWT, Swing, JavaFX & SWT 3
M Gridbaglayout Spaltenbreite AWT, Swing, JavaFX & SWT 3
M LayoutManager GridBagLayout passt seine größe nicht an AWT, Swing, JavaFX & SWT 3
V GridBagLayout AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben