Mehrere Komponenten untereinander im BorderLayout

hi,
ich hab ein split pane erstellt und im rechten splitfenster ein borderlayout , in der Borderlayout.NORTH Region will ich zwei “Zeilen” haben bzw oben ein paar buttons horizontal nebeneinander und eine “Zeile” tiefer ein Textfeld das sich über die ganze Breite erstellt…
nunja hab bissl rumprobiert… kann ich das mit dem Standard FlowLayout machen oder nur mit GridBagLayout ? habs mit dem GridBL versucht und bkeomms irgendwie nicht hin mit den Constraints,…
wenn ich das mit dem WindowBuilder öffne scheint der GirdBagLayout für das BorderLayout NORTH Panel richtig gesetzt zu sein, aber wenn ich paar komponenten dazumache wird das GridBagL nicht mehr im WindowBuilder fenster angezeigt bzw ist plötzlich verschwunden…?!
hier mein Quellcode, ist ein bisschen unübersichtlich:

package de.htw.saarland.kinodb.window;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.LayoutManager;

import javax.swing.AbstractButton;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ListSelectionModel;
import javax.swing.border.EmptyBorder;
import javax.swing.JMenuItem;
import javax.swing.JSplitPane;
import javax.swing.JList;
import javax.swing.JScrollBar;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.SwingConstants;

import java.awt.FlowLayout;
import java.awt.CardLayout;

import javax.swing.BoxLayout;

import java.awt.Component;

public class Ticket_Overview extends JFrame {

	private  JFrame frame;
	private JPanel leftSplitPane, rightSplitPane;
	private JSplitPane splitPane;
	private Object[] dings = {"PC","Desktop","Computer","Lampe","Flugzeug","Haus","AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"};
	private JList<?> filmlist;
	private JScrollPane filmScrollPane;
	private JPanel rightNorth, rightSouth;

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

	/**
	 * Create the frame.
	 */	
	public Ticket_Overview() {
		frame = new JFrame("Kinoverwaltung V0.1 - Ticketverkauf");
		//setTitle("Kinoverwaltung V0.1 - Ticketverkauf");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setBounds(100, 100, 753, 452);
		frame.setVisible(true);
		
		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);
		
		JMenu mnStart = new JMenu("Start");
		menuBar.add(mnStart);
		
		JMenuItem mntmEntry_2 = new JMenuItem("Entry1");
		mnStart.add(mntmEntry_2);
		
		JMenuItem mntmEntry_3 = new JMenuItem("Entry2");
		mnStart.add(mntmEntry_3);
		
		JMenu mnHilfe = new JMenu("Hilfe");
		menuBar.add(mnHilfe);
		
		JMenuItem mntmEntry = new JMenuItem("Entry1");
		mnHilfe.add(mntmEntry);
		
		JMenuItem mntmEntry_1 = new JMenuItem("Entry2");
		mnHilfe.add(mntmEntry_1);
		getContentPane().setLayout(null);
		
		
		
		
		//################################################################################# LINKES SPLITPANE
		
		//GRIDBAGLAYOUT FÜR DAS LINKE SPLITPANE PANEL FESTLEGEN
		GridBagLayout gbl = new GridBagLayout();		
		
		
		//GRIDBAGCONSTRAINT FÜR DIE LISTE DER FILME IN DER TICKETÜBERSICHT
		GridBagConstraints listConstraints = new GridBagConstraints();
		listConstraints.gridx 		= 0;
		listConstraints.gridy 		= 0;
		listConstraints.fill 		= GridBagConstraints.BOTH;	
		listConstraints.gridwidth 	= 1;
		listConstraints.gridheight 	= 1;
		listConstraints.weightx 	= 0; //Verteilung des Überschüssigen Platzes 
		listConstraints.weighty 	= 100;
		listConstraints.insets =  new Insets(0,0,10,0);
		
		//GridLayout gl = new GridLayout(0,1);		
		
		//LINKES SPLITPANE ERSTELLEN MIT GRIDBAGLAYOUT
		leftSplitPane = new JPanel();
		leftSplitPane.setLayout(gbl);
		leftSplitPane.setPreferredSize(new Dimension(300,600));
		
		//LISTE DER FILME ERSTELLEN UND INS LINKE PANEL AN ERSTER STELLE EINSETZEN
		filmlist = new JList(dings);	
		//filmlist.setPreferredSize(new Dimension(100, 300));
		filmlist.setVisibleRowCount(10);
		filmlist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);		
		filmScrollPane = new JScrollPane(filmlist,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		filmScrollPane.setPreferredSize(new Dimension(100,300));
		//gbl.setConstraints(leftSplitPane, listConstraints);
		leftSplitPane.add(filmScrollPane, listConstraints);
		
		
		//BUTTON FÜR KOMMENDE FILME ERSTELLEN MIT CONSTRAINTS UNTER DIE LISTE
		GridBagConstraints kommendeFilmeConstraints = new GridBagConstraints();
		kommendeFilmeConstraints.gridx = 0;
		kommendeFilmeConstraints.gridy = kommendeFilmeConstraints.RELATIVE;
		kommendeFilmeConstraints.gridwidth= 1;
		kommendeFilmeConstraints.gridheight=1;		
		kommendeFilmeConstraints.insets =  new Insets(0,0,10,0);
	
				
		JButton kommendeFilme = new JButton("kommende Filme");
		kommendeFilme.setHorizontalAlignment(SwingConstants.LEADING);
		leftSplitPane.add(kommendeFilme,kommendeFilmeConstraints);
		//gbl.setConstraints(kommendeFilme, kommendeFilmeConstraints );
		
		
		//CONSTRAINTS FÜR TEXTFELD ERSTELLEN
		GridBagConstraints reservierungFeldConstraints = new GridBagConstraints();
		reservierungFeldConstraints.gridx = 0;
		//ReservierungFeldConstraints.gridy = 0;
		//ReservierungFeldConstraints.gridwidth = 1;
		//ReservierungFeldConstraints.gridheight = 1;		
		reservierungFeldConstraints.fill=GridBagConstraints.HORIZONTAL;
		reservierungFeldConstraints.weightx=1.0;
		reservierungFeldConstraints.weighty=0.5;	
		reservierungFeldConstraints.insets = new Insets(10,0,10,0);
		
		//TEXTFELD ERSTELLEN MIT CONSTRAINTS UNTER DEN BUTTON
		JTextField reservierungFeld = new JTextField("Reservierung suchen");
		reservierungFeld.setLayout(new GridBagLayout());
		reservierungFeld.setPreferredSize(new Dimension(1000,30));	
		reservierungFeld.setBackground(Color.RED);		
		leftSplitPane.add(reservierungFeld, reservierungFeldConstraints);
		//gbl.setConstraints(reservierungFeld, ReservierungFeldConstraints);
		
		
		//BUTTON ERSTELLEN FÜR RESERVIERUNG SUCHEN MIT CONSTRAINTS UNTER DAS RESERVIERUNG SUCHEN-FELD
		JButton reservierungSuchen = new JButton("Reservierung suchen");
		reservierungSuchen.setLayout(new GridBagLayout());
		
		GridBagConstraints reservierungSuchenConstraint = new GridBagConstraints();
		reservierungSuchenConstraint.gridx = 0;
		reservierungSuchenConstraint.gridx = 0;
		reservierungSuchenConstraint.gridwidth = 1;
		reservierungSuchenConstraint.gridheight = 1;
		reservierungSuchenConstraint.weightx = 1.0;
		reservierungSuchenConstraint.weighty = 0.5;
		
		leftSplitPane.add(reservierungSuchen,reservierungSuchenConstraint);	
		
		
		
		//########################################################################### RECHTES SPLITPANE
		
		//RECHTES SPLITPANEL ERSTELLEN MIT BORDERLAYOUT
		rightSplitPane = new JPanel(new BorderLayout());	
		rightSplitPane.setPreferredSize(new Dimension(600,600));
		
		
		//CONSTRAINTS FÜR BORDERLAYOUT.NORTH ERSTELLEN
		GridBagConstraints constraints = new GridBagConstraints();
		//constraints.gridx = 0;
		//constraints.gridy = 0;			
		constraints.fill 		= GridBagConstraints.BOTH;	
		constraints.gridwidth 	= 1;
		constraints.gridheight 	= 1;
		constraints.weightx 	= 0; //Verteilung des Überschüssigen Platzes 
		constraints.weighty 	= 0;
		constraints.insets =  new Insets(0,0,0,0);
				
		
		//PANEL FÜR  BORDERLAYOUT.NORTH ERSTELLEN MIT CONSTRAINTS		
		rightNorth = new JPanel();
		
		rightSplitPane.add(rightNorth,BorderLayout.NORTH);
		rightNorth.setLayout(new BoxLayout(rightNorth, BoxLayout.X_AXIS));
		
		JLabel filmtitel = new JLabel("Filmtitel: ");
		//filmtitel.setPreferredSize(new Dimension(50,30));		
		rightNorth.add(filmtitel );
		
		
		JTextField filmname = new JTextField("Filmname");
		//filmname.setPreferredSize(new Dimension(10,10));
		rightNorth.add(filmname);	
		
		
		JLabel uhrzeitdatum = new JLabel("Datum,Uhrzeit");
		rightNorth.add(uhrzeitdatum);
		
		JTextField datumuhrzeit = new JTextField("Datum,Uhrzeit");
		rightNorth.add(datumuhrzeit);
		
		JLabel saal = new JLabel("Saal");
		saal.setHorizontalAlignment(SwingConstants.RIGHT);
		rightNorth.add(saal);
		
		JTextField saaltext = new JTextField("Saal");
		rightNorth.add(saaltext);
		
		JButton weiter = new JButton("Weiter");
		weiter.setHorizontalAlignment(SwingConstants.RIGHT);
		rightNorth.add(weiter);
		
		
		JTextField test = new JTextField("ALKDLAKSLDKLAKSLDKLASKD");
		
		
		
		rightSouth = new JPanel();
		rightSplitPane.add(rightSouth,BorderLayout.SOUTH);
		rightSouth.setBackground(Color.BLUE);
		rightSouth.setPreferredSize(new Dimension(600,30));

				
		splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,  leftSplitPane, rightSplitPane);	
		//splitPane.setSize(new Dimension(600,400));
		splitPane.setOneTouchExpandable(true);		
		//splitPane.setBounds(0, 0, 434, 241);
		splitPane.setResizeWeight(0.1); // Fensterverhältnis links / rechts zu Beginn
		//splitPane.setDividerLocation(150 + splitPane.getInsets().left); //linke Breite : 150 px bis zum Divider
		/*splitPane.setDividerLocation(splitPane.getSize().width  //rechte Breite: 150 px bis zum Divider
                - splitPane.getInsets().right
                - splitPane.getDividerSize()
                - 150);*/
		splitPane.setDividerLocation(0.5); //25% of space go to left
		frame.getContentPane().add(splitPane);
		

		
		frame.pack();
		
		
		
	}
}

Ganz ehrlich, machs ohne GUI-Builder, verschachtele die Komponenten so, dass dein Layout stimmt und fertsch.
ala

import java.awt.Color;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class LayoutKSKB{
	
	
	public static void main(String[] args) {
		JPanel mainPanel = new JPanel(new BorderLayout());
		JPanel footerPanel = new JPanel();
			footerPanel.setBackground(Color.WHITE);
			footerPanel.add(new JLabel("LabelText"));
		JPanel centerPanel = new JPanel();
			centerPanel.setBackground(Color.ORANGE);
		JPanel headPanel = new JPanel(new GridLayout(2, 1));
		JPanel buttonPanel = new JPanel(new GridLayout(1, 3));
			for(int i=0; i<3; i++){
				buttonPanel.add(new JButton("Button " + (i+1)));
			}
		
		headPanel.add(buttonPanel);
		headPanel.add(new JTextField());
		
		mainPanel.add(BorderLayout.NORTH, headPanel);
		mainPanel.add(BorderLayout.CENTER, centerPanel);
		mainPanel.add(BorderLayout.SOUTH, footerPanel);
		
		
		JFrame frame = new JFrame();
			frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			frame.setSize(800, 600);
			frame.setLocationRelativeTo(null);
			
			frame.add(mainPanel);
			frame.setVisible(true);
		
	}

}```

Geht es um den Inhalt von “rightNorth”? Das ist im Moment so anders, als das, was du beschrieben hast…!?

Der Beschreibung nach dachte ich an sowas wie ein

rightNorth = new JPanel(new BorderLayout());
JPanel buttonsPanel = new JPanel(new GridLayout(1,0));
addAllButtonsTo(buttonsPanel);
rightNorth.add(buttonsPanel, BorderLayout.NORTH);
rightNortz.add(textField, BorderLayout.CENTER);

aber das passt irgendwie nicht zum Code…

@Marco13 naja nicht ganz, also rightNorth ist schon ein JPanel im Nordenbereich von einem BorderLayout… nun überleg ich mir welches Layout in dieses Panel reinkommt, mit GridBagLayout wird alles verstellt und ist so kompliziert,
beim GridLayout ist doch das Problem dass ich zwar 2 zeilen und egal wieviel spalten machen kann, aber die komponenten haben soweit ich weiss alle eine Feste größe und in der zweiten Zeile will ich ein Textpanel oder irgendwas machen was über die ganze Breite geht und quasi eine „Kinoleinwand“ symbolisch darstellen soll.

Aber wie ich grad aus dem BEispiel von vanny gesehen hab können die KOmponenten im GridLayout ja doch unterschiedl. Größe haben :wink: dann probier ich’s mal so aus, thx …

*** Edit ***

hab ein weiteres Problem, vom Aufbau stimmt die Leiste nun so, aber die Buttons, JLabels usw. haben nicht ihren korrekten Platz, z.B soll das JTextField mit dem Filmnamen direkt rechts neben dem JLabel „Filmname“ erscheinen sodass man sieht dass die zusammengehören, desweiteren sollen die komponenten nicht alle den restlichen zur verfügung stehenden platz in der HOrizontalen einnehmen sondern „abgegrenzt“ werden. und der Button „Weiter“ oben rechts soll auch normal symmetrisch aussehen… ich hab mal ein Bild hochgeladen:

Schau mal in den Wiki-Eintrag zum GridLayout. Vielleicht hilft der dir schon mal weiter.
Wenn nicht, schauen wir uns das noch mal im Detail an.

ja aber das mit hgap , vgap hat nicht viel weitergeholfen, die Buttons haben immernoch ihre standardgrößen über das ganze Kästchen und vllt nur mit horiz. / vertk. abständen dazwischen… und mit setPreferredSize gehts irgendwie auch nicht … kann ich die Komponenten, also BUttons ,JLabels, JTextFields usw noch customizen mit GridLayout oder geht das damit nicht?

Beim GridLayout sind erstmal alle Components gleich groß. Deswegen hatte ich noch dieses „buttonPanel“ angedeutet. Wenn man sowas hat wie



rightNorth mit GridLayout(2,1)
 _________________
|    buttonPanel  |
|_________________|
|    textField    |
|_________________|

dann kann mit im ‚buttonPanel‘ natülich auch ein Layout verwenden, wo NICHT alle Components gleich groß sind. (Und falls die obere und untere Hälfte NICHT gleich groß sein sollen, würde man da eben auch kein GridLayout(2,1) verwenden, sondern wieder ein BorderLayout, wie im angedeuteten Code)

Da kommt’s eben drauf an, was da drin sein soll :wink: