Probleme mit GridBagLayout

der_rumpel

Mitglied
Hi,

ich habe eine Gui gebastelt, welche besteht aus einem erweiterten SplitPaneLayout,
so dass ich oben im oberen Bereich eine eine Textaerea und ein Panel habe, im unteren Bereich 3 Panels.

Die 3 unteren Panels habe ich mit ein GridBagLayout angeordnet damit sie nebeneinander sind und möchte jetzt die 3 Panels wider mit einem GridBagLayout weiter bearbeiten.

Leider kann ich in den GridBagConstraints angeben was ich will, es reagiert einfach nicht, das Label befindet sich immer in der Mitte des Panels. Ich habe jetzt schon alles mögliche probiert, vielleicht kann mir jemand helfen.

Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.Arrays;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.border.Border;


public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		JFrame frame = new JFrame();
		
		JPanel panelBottom = new JPanel(new GridBagLayout());
		JPanel panel1 = new JPanel(new GridBagLayout());
		JPanel panel2 = new JPanel(new GridBagLayout());
		JPanel panel3 = new JPanel(new GridBagLayout());
		JComponent label1 = new JLabel("jkdfhajksdfh");
		JLabel label2  = new  JLabel("asdklöjfaskldjfaklö");
		Border lowerBorder;
		
		lowerBorder = BorderFactory.createLoweredBevelBorder();
		
		
	
		
		
		SplitPaneTop splitPaneTop = new SplitPaneTop();
		JSplitPane top = splitPaneTop.getSplitPane();
		top.setBorder(null);
		
		
		
		panelBottom.setPreferredSize(new Dimension(900, 200));
		//panelBottom.setBackground(Color.GRAY);
		
		GridBagConstraints gbc1 = new GridBagConstraints();
		gbc1.fill = GridBagConstraints.BOTH;
		gbc1.gridx = 0;
		gbc1.gridy = 0;
		//gbc1.insets = new Insets(5,5,5,5);
		
		panel1.setPreferredSize(new Dimension(300, 200));
		panel1.setBackground(Color.GREEN);
		panel1.setBorder(lowerBorder);
		panelBottom.add(panel1, gbc1);
		
		GridBagConstraints gbc2 = new GridBagConstraints();
		gbc2.fill = GridBagConstraints.BOTH;
		gbc2.gridx = 1;
		gbc2.gridy = 0;
		//gbc2.insets = new Insets(5,5,5,5);
		
		panel2.setPreferredSize(new Dimension(300, 200));
		//panel2.setBackground(Color.ORANGE);
		panel2.setBorder(lowerBorder);
		panelBottom.add(panel2, gbc2);
		
		GridBagConstraints gbc3 = new GridBagConstraints();
		gbc3.fill = GridBagConstraints.BOTH;
		gbc3.gridx = 3;
		gbc3.gridy = 0;
		//gbc3.insets = new Insets(5,5,5,5);
		
		panel3.setPreferredSize(new Dimension(300, 200));
		//panel3.setBackground(Color.BLUE);
		panel3.setBorder(lowerBorder);
		panelBottom.add(panel3, gbc3);
		
		
		GridBagConstraints gbcP1 = new GridBagConstraints();
		gbcP1.fill = GridBagConstraints.BOTH;
		//gbcP1.gridwidth = GridBagConstraints.REMAINDER;
		gbcP1.anchor = GridBagConstraints.PAGE_START;
		gbcP1.gridy =4;
		gbcP1.gridx = 5;
		
		panel1.add(label1, gbcP1);
		
		GridBagConstraints gbcP2 = new GridBagConstraints();
//		gbcP2.gridx = 0;
//		gbcP2.gridy = 1;
		panel2.add(label2, gbcP2);
		
		

		
		JSplitPane splitPaneVertical = new JSplitPane(JSplitPane.VERTICAL_SPLIT, top, panelBottom);

		 splitPaneVertical.setOneTouchExpandable(true);
	     splitPaneVertical.setDividerLocation(180);

        //Provide minimum sizes for the two components in the split pane
        top.setMinimumSize(new Dimension(100, 50));
        panelBottom.setMinimumSize(new Dimension(300, 200));
	        
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setContentPane(splitPaneVertical);
		frame.pack();
		frame.setVisible(true);
		
		
		
		
		
		
	}
}


Java:
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.text.TabableView;


public class SplitPaneTop {
	
	JTextArea tA1, tA2;
	
	JScrollPane sP1, sP2;
	JSplitPane splitPane;
	JPanel panelRight;
	
	public SplitPaneTop() {
		
		tA1 = new JTextArea("Dies ist ein Text", 50, 20);
		sP1 = new JScrollPane(tA1);
		
		panelRight = new JPanel();
		
//		tA2 = new JTextArea("Dies ist uach ein Text", 50,20);
//		sP2 = new JScrollPane(tA2);
		splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, sP1, panelRight);
		
		splitPane.setOneTouchExpandable(true);
        splitPane.setDividerLocation(450);
        
        Dimension minimumSize = new Dimension(100, 50);
        sP1.setMinimumSize(minimumSize);
        panelRight.setMinimumSize(minimumSize);
        
        splitPane.setPreferredSize(new Dimension(900, 200));
		
	}
	
	 public JSplitPane getSplitPane() {
	        return splitPane;
	 }
	 
	


}
 
wie soll es denn stattdessen aussehen?
andere Spalten oder Zeilen sind schlecht wenn sie komplett leer sind, ich füge teilweise new JLabel("") als Platzhalter ein
 
ja schon klar, das probiere ich ja schon die ganze Zeit, Sourcecode 1, Zeile 85, hab NORTH probiert, LINESTART usw, das problem ist es passiert nichts. Habe jetzt mehrere Lables und Textfields usw eingefügt, das ist auch alles ok, er setzt es mir nur nicht in die erste Zeile.

Hab den Code nochmal überarbeitet, da kann man es schön erkennen :-(

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.Border;


public class Gui extends JFrame{
	
	
	JFrame frame = new JFrame();	
	JPanel panelBottom;
	JPanel panel1;
	JPanel panel2;
	JPanel panel3;
	JComponent labelKontoNummer;
	JLabel label1Kontostand;
	JLabel labelEuro;
	JLabel labelEinzahlung;
	JLabel labelEuro1;
	JLabel labelAuszahlung;
	JLabel labelEuro2;
	JLabel labelBetrag;
	JTextField field1;
	JTextField field2;
	Border lowerBorder;
	
	
	public Gui(){
	
		
		
		
		lowerBorder = BorderFactory.createLoweredBevelBorder();
		
		
		
		createAndShowGui(createSplitPane(createAndFillPanelBottom()));
	
	}
		
	private JSplitPane createSplitPane(JPanel panelBottom){
		SplitPaneTop splitPaneTop = new SplitPaneTop();
		JSplitPane top = splitPaneTop.getSplitPane();
		top.setBorder(null);
		
		
		JSplitPane splitPaneVertical = new JSplitPane(JSplitPane.VERTICAL_SPLIT, top, panelBottom);

		 splitPaneVertical.setOneTouchExpandable(true);
	     splitPaneVertical.setDividerLocation(180);

        //Provide minimum sizes for the two components in the split pane
        top.setMinimumSize(new Dimension(100, 50));
        //panelBottom.setMinimumSize(new Dimension(300, 200));
        
        return splitPaneVertical;
			
			
	}
	
		
	private JPanel createAndFillPanelBottom(){
		
		JPanel panelBottom = new JPanel(new GridBagLayout());
		JPanel panel1 = new JPanel(new GridBagLayout());
		JPanel panel2 = new JPanel(new GridBagLayout());
		JPanel panel3 = new JPanel(new GridBagLayout());
		
		JComponent labelKontoNummer = new JLabel("Kontonummer: 05143691");
		JLabel label1Kontostand = new JLabel("Kontostand");
		JLabel labelEuro = new JLabel("Euro");
		JLabel labelEinzahlung = new JLabel("Einzahlung");
		JLabel labelEuro1 = new JLabel("Euro");
		JLabel labelAuszahlung = new JLabel("Auszahlung");
		JLabel labelEuro2 = new JLabel("Euro");
		JLabel labelBetrag  = new  JLabel("Betrag", JLabel.CENTER);
		JTextField field1 = new JTextField(5);
		JTextField field2 = new JTextField(5);
		
		
		
		panelBottom.setPreferredSize(new Dimension(1200, 200));
		//panelBottom.setBackground(Color.GRAY);
		
		GridBagConstraints gbc1 = new GridBagConstraints();
		gbc1.fill = GridBagConstraints.NONE;
		gbc1.gridx = 0;
		gbc1.gridy = 0;
		//gbc1.insets = new Insets(5,5,5,5);
		
		panel1.setPreferredSize(new Dimension(400, 200));
		//panel1.setBackground(Color.GREEN);
		panel1.setBorder(lowerBorder);
		panelBottom.add(panel1, gbc1);
		
		GridBagConstraints gbc2 = new GridBagConstraints();
		gbc2.fill = GridBagConstraints.BOTH;
		gbc2.gridx = 1;
		gbc2.gridy = 0;
		//gbc2.insets = new Insets(5,5,5,5);
		
		panel2.setPreferredSize(new Dimension(400, 200));
		panel2.setBackground(Color.ORANGE);
		panel2.setBorder(lowerBorder);
		panelBottom.add(panel2, gbc2);
		
		GridBagConstraints gbc3 = new GridBagConstraints();
		gbc3.fill = GridBagConstraints.BOTH;
		gbc3.gridx = 3;
		gbc3.gridy = 0;
		//gbc3.insets = new Insets(5,5,5,5);
		
		panel3.setPreferredSize(new Dimension(400, 200));
		panel3.setBackground(Color.BLUE);
		panel3.setBorder(lowerBorder);
		panelBottom.add(panel3, gbc3);
	
		
		GridBagConstraints gbcP1 = new GridBagConstraints();
		gbcP1.fill = GridBagConstraints.HORIZONTAL;
		gbcP1.anchor = GridBagConstraints.LINE_START;
		gbcP1.gridx = 1;
		gbcP1.gridy = 0;
		panel1.add(labelKontoNummer, gbcP1);
		
		gbcP1.gridx = 0;
		gbcP1.gridy = 1;
		panel1.add(label1Kontostand, gbcP1);
		
		gbcP1.gridx = 1;
		gbcP1.gridy = 1;
		panel1.add(labelBetrag, gbcP1);
		
		gbcP1.gridx = 2;
		gbcP1.gridy = 1;
		panel1.add(labelEuro, gbcP1);
		
		gbcP1.gridx = 0;
		gbcP1.gridy = 2;
		panel1.add(labelEinzahlung, gbcP1);
		
		gbcP1.gridx = 1;
		gbcP1.gridy = 2;
		panel1.add(field1, gbcP1);
		
		gbcP1.gridx = 2;
		gbcP1.gridy = 2;
		panel1.add(labelEuro1, gbcP1);
		
		gbcP1.gridx = 0;
		gbcP1.gridy = 3;
		panel1.add(labelAuszahlung, gbcP1);
		
		gbcP1.gridx = 1;
		gbcP1.gridy = 3;
		panel1.add(field2, gbcP1);
		
		gbcP1.gridx = 2;
		gbcP1.gridy = 3;
		panel1.add(labelEuro2, gbcP1);
		
		
		
//		GridBagConstraints gbcP2 = new GridBagConstraints();
//		gbcP2.gridx = 1;
//		gbcP2.gridy = 0;
//		panel1.add(label2, gbcP2);
		
		return panelBottom;

	}
	        
        
		
	
		void createAndShowGui(JSplitPane splitPaneVertical){
			JFrame frame = new JFrame();	
			
			frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			frame.setContentPane(splitPaneVertical);
			frame.pack();
			frame.setVisible(true);
			
		}
	
}
 
also falls du nicht die FAQ meinst reicht nur weighty in diesem Fall nicht ganz, bzw. hat eher unschönes Ergebnis dass alle Zeilen auseinander gehen

mein Vorschlag:
Rest unten auffüllen, als letztes zum panel1:

Java:
		gbcP1.weighty = 1;
		gbcP1.gridy = 4;
		panel1.add(new JLabel(""), gbcP1);
 
hey super 🙂, es funktioniert, das GridBagL. kann aber auch echt komplizert sein, vor allem wenn man was ausprobiert, es dann nicht funktioniert, aber eigentlich richtig ist, man aber die Idee schon wieder verworfen hat weil man denkt so funktioniert es auch nicht 😀

vielen Danke an euch
 

Zurück
Oben