Passendes Layout gesucht

daniel_sun

Erfahrenes Mitglied
Hallo,

ich habe folgendes Problem. Ich habe 2 Panel Typen eines welches eine Header enthält und dann ein Panel welches einen Content enthält. Nun soll das ganze in einem ScrollPane angezeigt werden (vertikal untereinander)

Die Reihenfolge in der es angezeigt wird ist immer: ein Header-Panel dann unterschiedliche viele content-panels dann wieder ein Header ect. Mit dem GridLaout kein problem
Code:
 new GridLayout(0,1,5,5)
kein problem.
Das Problem ist das mein HeaderPanel ist nur etwa 1/4 so groß wie der content somit skaliert der Header auf die größe der contents ( die gleich groß sind)

Nun ist die Frage welches Layout zeigt mir das ganz schön untereinander und vorallem mit den richtigen größen der Panel an. Ich weis das das passenste sicher dieses GridBagLayout ist aller dings komm ich damit nicht klar das verhalten dieses layouts ist für mich völlig unlogisch nach (nicht gelogen) 8 Stunden und 20 tutorials bekomme ich es immer noch nicht hin entweder wird nur der Header oder nur der content angezeigt. Und Zeilenbreite einstellen geht auch nicht. Ich suche nun ein anderes layout welches einfacher ist und den gleichen dienst tut.

Oder jemanden der mir ein Codebsp ( KEIN LINK ZU EINEM TUTORIAL) geben kann wie es funktioniert

Code:
int g = 0;
		
		for(int i=0; result.next(); i++){
			
			ScrollPanel.add(HeadPanel[i], new GridBagConstraints( 0, g, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(10, 10, 10, 10), 0, 0));
			g = g+1;
					
			for(int j = 0; result2.next(); j++){
					
						ScrollPanel.add(contentPanel[i][j],new GridBagConstraints( 0, g,	1, 2, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(10, 10, 10, 10), 0, 0));
				
				g = g+2;
			}
		}

(Stellen im Code wo ich Datenbankeinträge auslese und die Panels mit Werten fülle wurden entfernt)

So werden die head Panels z.B. nicht angezeigt.

Gruß
daniel_sun
 
hab grad mal bischen rumprobiert mithilfe von http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html :
Java:
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.ScrollPane;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;

import javax.swing.*;

public class LayoutTest extends JFrame {

	private Map<JPanel, Vector<JPanel>> panels;
	private Map<JLabel, Vector<JLabel>> testData;
	private GridBagLayout layout;
	private GridBagConstraints container;

	public LayoutTest() {
		super("Test");
		init(); //init2() üfr kleines panel beispiel
		setVisible(true);
	}

	public void init() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		// Layout erstellen und setzen
		layout = new GridBagLayout();
		getContentPane().setLayout(layout);

		// container erstellen
		container = new GridBagConstraints();

		// paar random daten holen
		testData = giveSomeTestData();

		// layout an daten anpassen
		morphLayout();

		// hier vllt auch noch die größe des main fensters in abhängigkeit der
		// daten
		setBounds(200, 200, 200, 250);
	}

	public void init2() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		layout = new GridBagLayout();
		getContentPane().setLayout(layout);
		container = new GridBagConstraints();
		panels = giveSomePanels();
		morphLayoutPanels();
		setBounds(200, 200, 200, 500);
	}

	// kleine label spielerei, zum repräsentieren der panels
	public Map<JLabel, Vector<JLabel>> giveSomeTestData() {
		Map<JLabel, Vector<JLabel>> myData = new HashMap<JLabel, Vector<JLabel>>();
		Vector<JLabel> v1 = new Vector<JLabel>();
		Vector<JLabel> v2 = new Vector<JLabel>();

		JLabel header1 = new JLabel("Header 1");
		JLabel header2 = new JLabel("Header 2");

		for (int i = 0; i < 5; i++) {
			v1.add(new JLabel("SubLabel " + i + " from Header 1"));
			v2.add(new JLabel("SubLabel " + i + " from Header 2"));
		}

		myData.put(header2, v2);
		myData.put(header1, v1);

		return myData;

	}

	public void morphLayout() {
		// du willst allesuntereinander, wir merken uns also die reihe
		int row = 0;

		// für jedes headerlabel
		for (JLabel l : testData.keySet()) {
			// positionierung in der zelle (das hier macht iwie zentriert)
			container.fill = GridBagConstraints.BOTH;;
			// x position der zelle (da alles untereinander immer 0)
			container.gridx = 0;
			// y position, unsere zeile/reihe
			container.gridy = row;
			// nächste reihe
			row++;
			// container zum panel adden
			add(l, container);

			// für jedes sublabel
			for (JLabel l2 : testData.get(l)) {
				// gleiche spielerei ...
				container.gridx = 0;
				container.gridy = row;
				row++;
				add(l2, container);
			}
		}
	}

	public Map<JPanel, Vector<JPanel>> giveSomePanels() {
		Map<JPanel, Vector<JPanel>> myPanel = new HashMap<JPanel, Vector<JPanel>>();

		for (int i = 0; i < 3; i++) {
			JPanel p = new JPanel();
			p.setBounds(0, 0, 100, 100);
			p.add(new JLabel("Ich bin Panel " + i));
			Vector<JPanel> v = new Vector<JPanel>();
			for (int j = 0; j < 4; j++) {
				JPanel p2 = new JPanel();
				p2.setBounds(0, 0, 100, 100);
				p2.add(new JLabel("Ich bin SubPanel " + j + " von Panel " + i));
				v.add(p2);
			}
			myPanel.put(p, v);
		}

		return myPanel;
	}

	public void morphLayoutPanels() {
		int row = 0;

		for (JPanel p : panels.keySet()) {
			container.fill = GridBagConstraints.BOTH;;
			container.gridx = 0;
			container.gridy = row;
			row++;
			add(p, container);

			for (JPanel p2 : panels.get(p)) {
				container.gridy = row;
				row++;
				add(p2, container);
			}
		}
	}

	public static void main(String[] args) {
		LayoutTest t = new LayoutTest();
	}

}

hoffe das hilft dir als kleine erklärung bischen weiter :)
willst du bestimmte zellen größer haben helfen container.gridwidth bzw height.


edit2::
countainer.fill = GridBagConstraints.BOTH;
damit kann man wohl die zellen "auto re-size-en" ^^

ist wohl echt komplex das layout, gibt wohl mehre arten zwischen den zellen zu switchen, hier nochmal ein komplexes beispiel, das versteh ich aber auch nicht so ganz, an sollte sich wohldie konstanten mal ganz genau angucken!:
http://docs.oracle.com/javase/7/docs/api/java/awt/GridBagLayout.html
bis runterscrollen ^^
 
Zuletzt bearbeitet:
Zurück