Probleme mit gridheight (GridBagLayout)

Bitte aktiviere JavaScript!
Hallo zusammen,

ich habe ein kleines Problem mit dem GridBagLayout. Bei einem Click auf den Button "Add Node" soll ein neuer Button dem JPanel "nodeArea" (nutzt das BoxLayout) hinzugefügt werden (Button "Node"). Das JPanel ist dem GridBagLayout zugewiesen und nimmt zwei Zeilen in der Höhe ein. Dies funktioniert bei der ersten Zeile. Bei allen weiteren Zeilen nimmt das JPanel nur noch eine Zeile ein.

So sieht die Oberfläche aktuell aus:
11641

Das wäre der Code Schnipsel:
Java:
                JButton addNode = new JButton("Add Node");
                addNode.setPreferredSize(new Dimension(120, 50));
                gbc.anchor = GridBagConstraints.NORTHWEST;
                gbc.weightx = 1;
                gbc.weighty = 1;
                gbc.fill = GridBagConstraints.VERTICAL;
                gbc.insets = new Insets(4, 4, 4, 4);
                gbc.gridx = 0;
                gbc.gridy = rowCounterAddNode; // 0
                subsubPanel.add(addNode, gbc);

                JButton removeRow = new JButton("Remove Row");
                removeRow.setPreferredSize(new Dimension(120, 50));
                gbc.anchor = GridBagConstraints.NORTHWEST;
                gbc.weightx = 1;
                gbc.weighty = 1;
                gbc.fill = GridBagConstraints.VERTICAL;
                gbc.insets = new Insets(4, 4, 4, 4);
                gbc.gridx = 0;
                gbc.gridy = rowCounterRemoveRow; // 1
                subsubPanel.add(removeRow, gbc);

                JPanel nodeArea = new JPanel();
                nodeArea.setLayout(new BoxLayout(nodeArea, BoxLayout.X_AXIS));
                nodeArea.setBorder(BorderFactory.createLineBorder(Color.black));
                gbc.anchor = GridBagConstraints.NORTHWEST;
                gbc.gridheight = 2;
                gbc.gridx = 1;
                gbc.gridy = rowCounterAddNode;
                gbc.fill = GridBagConstraints.BOTH;
                gbc.insets = new Insets(4, 4, 4, 4);

                addNode.addActionListener(new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {

                        Node node = new Node();
                        nodeArea.add(node.addNewNodeContainer());
                        nodeArea.revalidate();
                        nodeArea.repaint();

                    }

                });

                rowCounterAddNode += (rowCounterRemoveRow + 1);
                rowCounterRemoveRow += (rowCounterAddNode + 1);

                subsubPanel.add(nodeArea, gbc);
                subsubPanel.revalidate();
                subsubPanel.repaint();
In der Klasse "Node" wird in der Methode "addNewNodeContainer()" lediglich der JButton "Node" einem JPanel hinzugefügt und dann übergeben.

Gerne kann ich Euch noch mehr Code schicken. :)

Könnt Ihr mir sagen, wo der Fehler liegt, damit das JPanel "nodeArea" durchgehend zwei Zeilen überspannt?

Viele Grüße und einen schönen Abend

A456B123
 
A

Anzeige


Vielleicht hilft dir dieser Kurs hier weiter: (hier klicken)
Wo liegt das Problem?

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

public class Test {

    public void run() {
        JPanel panel = new JPanel(new GridBagLayout());

        JButton upper = new JButton("Upper");
        JButton lower = new JButton("Lower");
        JButton right = new JButton("Right");

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1;
        gbc.weighty = 1;
        panel.add(upper, gbc);
        
        gbc.gridy = 1;
        panel.add(lower, gbc);

        gbc.gridy = 0;
        gbc.gridx = 1;
        gbc.gridheight=2;
        panel.add(right, gbc);
        
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setContentPane(panel);
        frame.setSize(800, 600);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().run());
    }
}
 
Danke für Deine Antwort.

Möglicherweise war mein Bild nicht wirklich aussagekräftig. Habe mal die Zeilen rot umrandet:

11646

Dort sieht man, dass bei der ersten Zeile gridheight=2; funktioniert. Bei der zweiten Zeile jedoch nicht mehr. (Dort sollte der Kasten mit dem Button Node ebenfalls "Remove Row" umspannen.) Sollte aussehen wie in der ersten Zeile. Doch aus irgendeinem Grund funktioniert dies dann nicht mehr.

Die GUI Elemente werden dynamisch bei einem Button Click hinzugefügt, daher auch revalidate() und repaint() beim hinzufügen jedes neuen Elements (Zeile und Node Buttons).
 
Sehe aber immer noch kein Problem:
Java:
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.*;

public class Test {
    private int last;

    private JPanel content;
    private int row;

    private JPanel createRow() {
        JPanel panel = new JPanel(new GridBagLayout());

        JButton upper = new JButton("Add node");
        JButton lower = new JButton("Nothing");
        Box right = Box.createVerticalBox();
        upper.addActionListener(e -> {
            JButton button = new JButton(String.format("Button #%d", ++last));
            right.add(button);
            content.revalidate();
            content.repaint();
        });

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1;
        gbc.weighty = 1;
        panel.add(upper, gbc);
        
        gbc.gridy = 1;
        panel.add(lower, gbc);

        gbc.gridy = 0;
        gbc.gridx = 1;
        gbc.gridheight=2;
        panel.add(right, gbc);

        return panel;        
    }

    private void addRow() {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = 0;
        gbc.gridy = row++;
        gbc.weightx = 1;
        gbc.weighty = 1;

        content.add(createRow(), gbc);
        content.revalidate();
        content.repaint();
    }

    public void run() {
        content = new JPanel(new GridBagLayout());
        addRow();

        JButton button = new JButton("+");
        button.addActionListener(e -> addRow());
        
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(content);
        frame.add(button, BorderLayout.SOUTH);
        frame.setSize(800,600);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().run());
    }
}
 
Ich habe es heute noch einmal versucht und komme leider nicht auf den Fehler... ich habe mal einen ausführbaren Code erstellt, der das Problem darstellt.

Java:
package base;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class MVCView extends JFrame {

    private static final long serialVersionUID = 1L;
    private int rowCounterRemoveRow = 1;
    private int rowCounterAddNode = 0;
    private int rowCounterNode = 2;

    public MVCView() {
        init();
    }

    private void init() {

        BorderLayout bl = new BorderLayout();
        setLayout(bl);

        this.setTitle("Test");
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setExtendedState(this.MAXIMIZED_BOTH);

        JButton add_row = new JButton("Add new Row");
        JPanel subPanel = new JPanel();
        subPanel.setLayout(new FlowLayout(FlowLayout.LEFT));

        JPanel subsubPanel = new JPanel();
        subsubPanel.setBackground(Color.WHITE);
        subsubPanel.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();

        add_row.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                JButton addNode = new JButton("Add Node");
                addNode.setPreferredSize(new Dimension(120, 50));
                gbc.anchor = GridBagConstraints.NORTHWEST;
                gbc.weightx = 1;
                gbc.weighty = 1;
                // gbc.fill = GridBagConstraints.VERTICAL;
                gbc.insets = new Insets(4, 4, 4, 4);
                gbc.gridx = 0;
                gbc.gridy = rowCounterAddNode; // 0
                subsubPanel.add(addNode, gbc);

                JButton removeRow = new JButton("Remove Row");
                removeRow.setPreferredSize(new Dimension(120, 50));
                gbc.insets = new Insets(4, 4, 4, 4);
                gbc.gridx = 0;
                gbc.gridy = rowCounterRemoveRow; // 1
                subsubPanel.add(removeRow, gbc);

                JButton nodeArea = new JButton("Test");
                gbc.fill = GridBagConstraints.VERTICAL;
                gbc.gridheight = 2;
                gbc.gridx = 1;
                gbc.gridy = rowCounterAddNode;
                subsubPanel.add(nodeArea, gbc);

                rowCounterAddNode += (rowCounterRemoveRow + 1);
                rowCounterRemoveRow += (rowCounterAddNode + 1);

                subsubPanel.revalidate();
                subsubPanel.repaint();

            }

        });

        subPanel.add(subsubPanel);

        this.getContentPane().add(add_row, BorderLayout.SOUTH);
        this.getContentPane().add(subPanel, BorderLayout.CENTER);

        subPanel.revalidate();
        subPanel.repaint();

        this.pack();
        this.setVisible(true);
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new MVCView();
            }
        });
    
    }

}
 
Retoure:
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class MVCView extends JFrame {

    private static final long serialVersionUID = 1L;
    private int rowCounterRemoveRow = 1;
    private int rowCounterAddNode = 0;
    private int rowCounterNode = 2;

    public MVCView() {
        init();
    }

    private void init() {
        this.setTitle("Test");
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setExtendedState(this.MAXIMIZED_BOTH);

        JButton add_row = new JButton("Add new Row");
        JPanel subPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));

        JPanel subsubPanel = new JPanel();
        subsubPanel.setBackground(Color.WHITE);
        subsubPanel.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();

        add_row.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JButton addNode = new JButton("Add Node");
                addNode.setPreferredSize(new Dimension(120, 50));

                GridBagConstraints gbc = new GridBagConstraints();
                gbc.anchor = GridBagConstraints.NORTHWEST;
                gbc.weightx = 1;
                gbc.weighty = 1;

                gbc.insets = new Insets(4, 4, 4, 4);
                gbc.gridx = 0;
                gbc.gridy = rowCounterAddNode; // 0
                subsubPanel.add(addNode, gbc);

                JButton removeRow = new JButton("Remove Row");
                removeRow.setPreferredSize(new Dimension(120, 50));
                gbc.insets = new Insets(4, 4, 4, 4);
                gbc.gridx = 0;
                gbc.gridy = rowCounterRemoveRow; // 1
                subsubPanel.add(removeRow, gbc);

                JButton nodeArea = new JButton("Test");
                gbc.fill = GridBagConstraints.VERTICAL;
                gbc.gridx = 1;
                gbc.gridy = rowCounterAddNode;
                gbc.gridheight = 2;
                subsubPanel.add(nodeArea, gbc);

                rowCounterAddNode += 2;
                rowCounterRemoveRow += 2;

                subPanel.revalidate();
                subPanel.repaint();

            }

        });

        subPanel.add(subsubPanel);

        this.getContentPane().add(add_row, BorderLayout.SOUTH);
        this.getContentPane().add(subPanel, BorderLayout.CENTER);

        subPanel.revalidate();
        subPanel.repaint();

        this.pack();
        this.setVisible(true);
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new MVCView();
            }
        });
    
    }

}
 
Entschuldige bitte die späte Rückmeldung. Ich danke dir vielmals! :)
Habe alles in den restlichen Code kopiert und funktioniert einwandfrei!
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben