Swing Komponenten Anordnung eines Panels in Verbindung eines weiteren Panels

dbausnnd

Aktives Mitglied
Hallo,

ich habe die Aufgabe eine komplexe UI zu erstellen. Dabei wird ein Panel in einem Panel dargestellt. Das Problem dabei ist, dass beim GridBagLayout die beschreibenden Labels dabei unterschiedliche Längen haben.

Ein Panel enthält drei Labels gefolgt von einem TextField. Die Labels sind dabei relativ lang aufgrund des enthaltenen Textes. Darunter wird ein Panel angezeigt, welches ebenfalls drei Labels mit jeweils einen Textfield beinhaltet. Die Labels in diesem Panel sind wesentlich Kürzer. Dadurch stimmt die Orientierung der Komponenten nicht mehr.

Wie geht man in einer solchen Situation vor?

Gruß
dbausnnd
 
Moin,

habe ganz offen gestanden kein Wort verstanden ... 🙁
Kannst Du mal (vlt. mit einem Beispiel/einer Beispieldarstellung) zeigen, was Du meinst ??
Hast Du bereits eine Ansatz, bei dem irgendwas nicht funktioniert?

Gruß Klaus
 
Hier das Beispiel:

Das Frame:
Java:
import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.GridBagLayout;
import javax.swing.JLabel;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import javax.swing.JTextField;

public class TestLayoutManager extends JFrame {

    private JPanel contentPane;
    private JTextField textField;
    private JTextField textField_1;
    private JTextField textField_2;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    TestLayoutManager frame = new TestLayoutManager();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public TestLayoutManager() {
        init();
    }
    private void init() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        GridBagLayout gbl_contentPane = new GridBagLayout();
        gbl_contentPane.columnWidths = new int[]{0, 0, 0};
        gbl_contentPane.rowHeights = new int[]{0, 0, 0, 0, 0};
        gbl_contentPane.columnWeights = new double[]{1.0, 1.0, Double.MIN_VALUE};
        gbl_contentPane.rowWeights = new double[]{0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE};
        contentPane.setLayout(gbl_contentPane);
        {
            JLabel lblNewLabel = new JLabel("New labelNew labelNew label");
            GridBagConstraints gbc_lblNewLabel = new GridBagConstraints();
            gbc_lblNewLabel.anchor = GridBagConstraints.WEST;
            gbc_lblNewLabel.insets = new Insets(0, 0, 5, 5);
            gbc_lblNewLabel.gridx = 0;
            gbc_lblNewLabel.gridy = 0;
            contentPane.add(lblNewLabel, gbc_lblNewLabel);
        }
        {
            textField = new JTextField();
            GridBagConstraints gbc_textField = new GridBagConstraints();
            gbc_textField.insets = new Insets(0, 0, 5, 0);
            gbc_textField.fill = GridBagConstraints.HORIZONTAL;
            gbc_textField.gridx = 1;
            gbc_textField.gridy = 0;
            contentPane.add(textField, gbc_textField);
            textField.setColumns(10);
        }
        {
            JLabel lblNewLabel_1 = new JLabel("New labelNew labelNew label");
            GridBagConstraints gbc_lblNewLabel_1 = new GridBagConstraints();
            gbc_lblNewLabel_1.anchor = GridBagConstraints.WEST;
            gbc_lblNewLabel_1.insets = new Insets(0, 0, 5, 5);
            gbc_lblNewLabel_1.gridx = 0;
            gbc_lblNewLabel_1.gridy = 1;
            contentPane.add(lblNewLabel_1, gbc_lblNewLabel_1);
        }
        {
            textField_1 = new JTextField();
            GridBagConstraints gbc_textField_1 = new GridBagConstraints();
            gbc_textField_1.insets = new Insets(0, 0, 5, 0);
            gbc_textField_1.fill = GridBagConstraints.HORIZONTAL;
            gbc_textField_1.gridx = 1;
            gbc_textField_1.gridy = 1;
            contentPane.add(textField_1, gbc_textField_1);
            textField_1.setColumns(10);
        }
        {
            JLabel lblNewLabel_2 = new JLabel("New labelNew labelNew label");
            GridBagConstraints gbc_lblNewLabel_2 = new GridBagConstraints();
            gbc_lblNewLabel_2.anchor = GridBagConstraints.WEST;
            gbc_lblNewLabel_2.insets = new Insets(0, 0, 5, 5);
            gbc_lblNewLabel_2.gridx = 0;
            gbc_lblNewLabel_2.gridy = 2;
            contentPane.add(lblNewLabel_2, gbc_lblNewLabel_2);
        }
        {
            textField_2 = new JTextField();
            GridBagConstraints gbc_textField_2 = new GridBagConstraints();
            gbc_textField_2.insets = new Insets(0, 0, 5, 0);
            gbc_textField_2.fill = GridBagConstraints.HORIZONTAL;
            gbc_textField_2.gridx = 1;
            gbc_textField_2.gridy = 2;
            contentPane.add(textField_2, gbc_textField_2);
            textField_2.setColumns(10);
        }
        {
            TestLayoutManagerInnerPanel testLayoutManagerInnerPanel = new TestLayoutManagerInnerPanel();
            GridBagConstraints gbc_testLayoutManagerInnerPanel = new GridBagConstraints();
            gbc_testLayoutManagerInnerPanel.gridwidth = 2;
            gbc_testLayoutManagerInnerPanel.insets = new Insets(0, 0, 0, 5);
            gbc_testLayoutManagerInnerPanel.fill = GridBagConstraints.BOTH;
            gbc_testLayoutManagerInnerPanel.gridx = 0;
            gbc_testLayoutManagerInnerPanel.gridy = 3;
            contentPane.add(testLayoutManagerInnerPanel, gbc_testLayoutManagerInnerPanel);
        }
    }

}

Das inner Panel:
Java:
import javax.swing.JPanel;
import java.awt.GridBagLayout;
import javax.swing.JLabel;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import javax.swing.JTextField;

public class TestLayoutManagerInnerPanel extends JPanel {
    private JTextField textField;
    private JTextField textField_1;
    private JTextField textField_2;

    /**
     * Create the panel.
     */
    public TestLayoutManagerInnerPanel() {

        init();
    }
    private void init() {
        GridBagLayout gridBagLayout = new GridBagLayout();
        gridBagLayout.columnWidths = new int[]{0, 0, 0, 0};
        gridBagLayout.rowHeights = new int[]{0, 0, 0, 0};
        gridBagLayout.columnWeights = new double[]{0.0, 1.0, 0.0, Double.MIN_VALUE};
        gridBagLayout.rowWeights = new double[]{0.0, 0.0, 0.0, Double.MIN_VALUE};
        setLayout(gridBagLayout);
        {
            JLabel lblA = new JLabel("A");
            GridBagConstraints gbc_lblA = new GridBagConstraints();
            gbc_lblA.anchor = GridBagConstraints.EAST;
            gbc_lblA.insets = new Insets(0, 0, 5, 5);
            gbc_lblA.gridx = 0;
            gbc_lblA.gridy = 0;
            add(lblA, gbc_lblA);
        }
        {
            textField = new JTextField();
            GridBagConstraints gbc_textField = new GridBagConstraints();
            gbc_textField.insets = new Insets(0, 0, 5, 5);
            gbc_textField.fill = GridBagConstraints.HORIZONTAL;
            gbc_textField.gridx = 1;
            gbc_textField.gridy = 0;
            add(textField, gbc_textField);
            textField.setColumns(10);
        }
        {
            JLabel lblB = new JLabel("B");
            GridBagConstraints gbc_lblB = new GridBagConstraints();
            gbc_lblB.anchor = GridBagConstraints.EAST;
            gbc_lblB.insets = new Insets(0, 0, 5, 5);
            gbc_lblB.gridx = 0;
            gbc_lblB.gridy = 1;
            add(lblB, gbc_lblB);
        }
        {
            textField_1 = new JTextField();
            GridBagConstraints gbc_textField_1 = new GridBagConstraints();
            gbc_textField_1.insets = new Insets(0, 0, 5, 5);
            gbc_textField_1.fill = GridBagConstraints.HORIZONTAL;
            gbc_textField_1.gridx = 1;
            gbc_textField_1.gridy = 1;
            add(textField_1, gbc_textField_1);
            textField_1.setColumns(10);
        }
        {
            JLabel lblC = new JLabel("C");
            GridBagConstraints gbc_lblC = new GridBagConstraints();
            gbc_lblC.anchor = GridBagConstraints.EAST;
            gbc_lblC.insets = new Insets(0, 0, 0, 5);
            gbc_lblC.gridx = 0;
            gbc_lblC.gridy = 2;
            add(lblC, gbc_lblC);
        }
        {
            textField_2 = new JTextField();
            GridBagConstraints gbc_textField_2 = new GridBagConstraints();
            gbc_textField_2.insets = new Insets(0, 0, 0, 5);
            gbc_textField_2.fill = GridBagConstraints.HORIZONTAL;
            gbc_textField_2.gridx = 1;
            gbc_textField_2.gridy = 2;
            add(textField_2, gbc_textField_2);
            textField_2.setColumns(10);
        }
    }

}

Das Ergebnis:


Die Labels des Frames und des inneren Panels passen nicht zusammen. Das möchte ich beheben.
 
Zuletzt bearbeitet von einem Moderator:
Ah ... jetzt ... 🙂

Das wird dann so ohne weiteres nicht gehen! Es ist ja grundlegend schließlich der Sinn und Zweck einen Layoutsmanagers, die Objekte automatisch zu arrangieren!
Und Gridbag ist dann nicht sonderlich zielführend, da die Objekte hier ja immer auf die komplette Höhe/Breite optimiert werden!

Warum überhaupt zwei verschiedene Panel ??

Versuch' ggf. mal das GroupLayout!
https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html
http://www.java-tutorial.org/layout-manager.html

Gruß Klaus
 
Habe mir jetzt das GroupLayout angesehen. Das GroupLayout kann das doch auch nicht liefern.

Ich möchte um einige der Komponenten einen TitledBorder haben. Das bekomme ich in in dem ich diese Komponenten in einem eigenen Panel lege. Dann passen die Größen der Komponenten nicht mehr.

Wie kann ich sonst einen Rahmen um mehrere Komponenten zeichnen?
 
Wenn eine Komponente keine (mindest) Weite/Höhe gesetzt bekommt dann werden die meisten LayoutManager dieser Komponente nur soviel Platz wie notwendig zur Verfügung stellen.
Spiele dich doch einfach mit den LayoutManagern, es ist ja auch möglich mehrere Panels mit unterschiedlichen LayoutManager zu verschachteln.
Probiere alle LayoutManager mal aus, gib den Komponenten unterschiedliche Größen oder Margins oder Ausrichtungen und schaue dir das Verhalten an.
 

Zurück
Oben