Layoutprobleme

Status
Nicht offen für weitere Antworten.

Corcovado

Bekanntes Mitglied
Hallo, ich dreh absolut am Rad, ich hab ein Layout Problem.... Wahrscheinlich kann man es irgendwie loesen aber ich weis nicht wo ich da anfangen soll. Zur veranschaulichung hab ich versucht einen kleinen Frame mit zwei Panels zu schreiben, die einige Elemente beinhalten (aehnlich wie in meinem Projekt).
So das ganze begann als ich mit setPreferredSize versuchen wollte meine Buttons alle gleich gross zu machen. Dies gelang jedoch nicht, weil wohl wahrscheinlich das Layout sie immer zwanghaft schrumpfte. als ich in den Panels das Layout soweit hatte, dass dies nicht mehr passiert bekam ich nun das Problem das die Groesse des Frames zu gering war, weil sich nun alles auszudehenen schien. Ich komm mir schon vor wie bei Alice im Wunderland - es ist alles immer ewig zu klein, unpassend oder zu gigantisch.
Endlich hatte ich ein Panel das passte und auch ein andres (sh Bsp). Ein kleines und ein grosses. Gebe ich beide zusammen in einem Frame geht die Kacke wieder los (ich will die gleiche Breite aber die unterschiedliche Hoehe ist durchaus erwuenscht!!! Beide fuer sich alleine passen. Ich weiss, dass sich das Gridlayout immer wohl am Groessten Bestandteil orientiert, ein Flowlayout, haengt das alles immer nur rechts an, ich will es ja untereinander. Allerdings kenne ich mich im Dschungel der Layouts bei Java viel zu wenig aus - bitte helft mir eine normale Groesse zu finden.

Fragen:
Wie bekomme ich es hin bei dem Programm oben ein kleines und unten ein grosses Panel mit der Breite des unteren zu erzeugen?
Wie kann ich etwa die 6 Radiobuttons etwas naeher zusammenruecken - das sieht so nach dekadenter Platzverschwendung aus?
Code:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ScrollPaneConstants;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;

public class SeparatorPanel extends JPanel{
	
	public SeparatorPanel(){
		JFrame frame = new JFrame("blablabla");
		frame.setLayout(new GridLayout(2, 0));
		
		frame.add(drawSmallPanel());
		frame.add(drawBigPanel());
		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
		frame.setResizable(false);
		frame.setLocation(300,100);
		frame.setVisible(true);

		frame.pack();
	}
	
	
	private JPanel drawBigPanel(){
		// panel
		this.setLayout(new BorderLayout());		//GridLayout(2,2));
		this.setBorder(BorderFactory.createRaisedBevelBorder());
		
		// label
		JPanel jpOptions = new JPanel(new GridLayout(4,2));
		JLabel labelSeparator = new JLabel("blabla"); 
		jpOptions.add(labelSeparator);

		JButton butSeparator = new JButton("blablabla");
		butSeparator.setPreferredSize(new Dimension( 200, 40));
		jpOptions.add(butSeparator);
		
		// radiobuttons
		// jpSeparatorOptions::jpRow	
		JRadioButton[] rbSeparatorOptions = new JRadioButton[6];
		ButtonGroup rbGroup = new ButtonGroup();

		for(int cnt=0;cnt<6;cnt++){
			JPanel jpRow = new JPanel(new FlowLayout(FlowLayout.LEFT));
			final int iSelectedIndex = cnt;
			rbSeparatorOptions[cnt] = new JRadioButton("blabla");
			rbGroup.add(rbSeparatorOptions[cnt]);
			
			// action listener
			
			// set 5. separator as selected
			if(cnt == 4){
				rbSeparatorOptions[cnt].setSelected(true); 
			}
			jpRow.add( rbSeparatorOptions[cnt]);
			jpOptions.add(jpRow);
		}
		this.add(jpOptions, BorderLayout.NORTH);
		
		
		// table
		JPanel jpPreview = new JPanel(new FlowLayout());
		TableModel dataModel = new AbstractTableModel() {
			public int getColumnCount() { return 10; }
			public int getRowCount() { return 5;}
			public Object getValueAt(int row, int col) { return new Integer(row*col); }
		};
		JTable table = new JTable(dataModel);
		JScrollPane scrollpane = new JScrollPane(table);

		table.getTableHeader().setReorderingAllowed( false );
      	table.setBackground(jpPreview.getBackground());
        table.setPreferredScrollableViewportSize(new Dimension(500, 80));
        table.setBorder(BorderFactory.createRaisedBevelBorder());
        table.setOpaque(true);
        
        JScrollPane scrollPane = new JScrollPane(table);
        
        scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
        jpPreview.add(scrollPane);
		this.add(jpPreview, BorderLayout.SOUTH);
	
		return this;
	}
	
	
	private JPanel drawSmallPanel(){
		JPanel smallPanel = new JPanel();
		// panel : jpLoadPath
		smallPanel.setLayout(new GridLayout(2, 1));
		smallPanel.setBorder(BorderFactory.createRaisedBevelBorder());
		
		// label : jpLoadPath::jpLoadLabel
		JPanel jpLoadLabel = new JPanel( new GridLayout(1,2));
		JLabel labelLoad = new JLabel("blablabla");
		jpLoadLabel.add(labelLoad);
		
		// button : jpLoadPath::jpLoadLabel
		JButton butLoadPath = new JButton("blabla");
		butLoadPath.setPreferredSize(new Dimension( 200, 40));

		jpLoadLabel.add(butLoadPath);
		smallPanel.add(jpLoadLabel);
		//this.add(butLoadPath);
		
		// label : jpLoadPath
		JLabel labelLoadPath = new JLabel("bla/bla/bla");	
		smallPanel.add(labelLoadPath, BorderLayout.SOUTH);

		return smallPanel;
	}

	/////////////////////////////////////////////////////////////
	public static void main(String[] args){
		SeparatorPanel Sepp = new SeparatorPanel();
	}
}
 

Snape

Bekanntes Mitglied
Ach Du heiliger...das ist Kraut und Rüben. Kehre bitte in Dich, überdenke noch einmal, wie, wo und warum Du welche und wie viele JPanel und JFrame brauchst und dann setz das sauber um.
Ich wollte es "mal eben" gerade biegen, aber das ist so ein Durcheinander, das kostet mich eine halbe Stunde.
 

Corcovado

Bekanntes Mitglied
Aso - das is ja eben genau mein Problem, ich weiss nicht wie ich es anders darstellen soll, das dachte ich habe ich ja auch gefragt?! Danke fuer die hilfe, dass ich ein Problem habe, das haette ich nicht erkannt ;)
Kann mir vielleicht sonst jemand weiterhelfen wie man sowas macht - ich will die Panels, wenn man sie zB einzeln (also folgende Zeilen ein oder ausschaltet:
Code:
frame.add(drawSmallPanel());
frame.add(drawBigPanel());
) dann passen die Panels mit meinen Vorstellungen vom Aussehen ueberein - wie macht man sowas effektiv und so dass es auch noch passt, wenn man sie zusammensetzt, Danke?
 

Snape

Bekanntes Mitglied
Corcovado hat gesagt.:
Aso - das is ja eben genau mein Problem, ich weiss nicht wie ich es anders darstellen soll, das dachte ich habe ich ja auch gefragt?! Danke fuer die hilfe, dass ich ein Problem habe, das haette ich nicht erkannt ;)

Das Problem ist nicht nur das "anders darstellen", sondern Du scheinst ein generelles Verständnisproblem zu haben.
Du leitest Deine Klasse von JPanel ab, erzeugst darin ein JFrame und zwei weitere Panels. Setzt ein Layout auf Deine Klasse und auf mindestens eines der beiden Panel und fügst diese beiden Panel dann wiederum dem Frame hinzu. Das ist ziemlich gaga.

Kann mir vielleicht sonst jemand weiterhelfen wie man sowas macht - ich will die Panels, wenn man sie zB einzeln (also folgende Zeilen ein oder ausschaltet:
Code:
frame.add(drawSmallPanel());
frame.add(drawBigPanel());
) dann passen die Panels mit meinen Vorstellungen vom Aussehen ueberein - wie macht man sowas effektiv und so dass es auch noch passt, wenn man sie zusammensetzt, Danke?

1. Leite Deine Klasse nicht von JPanel ab sondern von JFrame
2. Weise der ContentPane des Frames einen LayoutManager zu, z.B. GridLayout oder BorderLayout.
3. Füge dann die beiden Panel der ContentPane hinzu.

Das ist alles, nicht so ein sinnfreies Gehampel wie das, was Du da veranstaltest. Sorry für die harten Worte, aber Du weißt echt nicht, was Du tust.
 

Corcovado

Bekanntes Mitglied
as ist alles, nicht so ein sinnfreies Gehampel wie das, was Du da veranstaltest.
BOAHHHH - SIE merk ich mich vor!!!... - scheisse... stimmt... ups - Sorry fuer den Datenwirrwarr...;)

Ich gebe zu ich hatte gestern nicht viel Zeit und hab daher in der Eile zuerst ein Panel in ein neues Projekt gehauen, dieses angepasst (so gut es ging) und dann das zweite Panel damit zusammen kurz bevor ich es postete wiederum in ein anderes Projekt getan und dabei einiges an Anpassungen uebersehn, sorry wollte das Forum nicht zumuellen :)


Aber mein Problem bleibt! Hier also der neue alte Code (ich hoffe er ist etwas uebersichtlicher). Wenn ich die Panels einzeln einhaenge (also zB im Konstructor das add( drawBigPanel( ) ) einfach auskommentiere und das this.setLayout auf GridLayout( 1 , 0 ) setze), passen sie mit dem ueberein, wie ich will wie sie aussehen. Fuege ich beide zusammen, wird alles unfoermig.

Fragen:
Wie schaffe ich es beide so zusammenzufuegen, dass sie ihre urspr. Hoehe beibehalten, aber beide die Breite des BigPanels haben?
Wieso ist beim BigPanel unter der Tabelle noch freier Platz? Das nervt mich schon lange aber wenn ich das Gridlayout da veraendere purzeln Buttons, Optionen und Tabelle total durcheinander - wie kann ich das loesen?
Wie kann ich allgemein beim BigPanel alles etwas naeher zusammenruecken - ohne, dass der Button kleiner wird?

Danke fuer Euer Verstaendnis nochmal..



Code:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ScrollPaneConstants;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;

public class SeparatorPanel extends JFrame{
	public SeparatorPanel(){
		super("blablabla");
		(this.getContentPane()).setLayout(new GridLayout(2,0));
		
		(this.getContentPane()).add(drawSmallPanel());
		(this.getContentPane()).add(drawBigPanel());
		
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
		this.setResizable(false);
		this.setVisible(true);

		this.pack();
	}
	
	
	private JPanel drawBigPanel(){
		// BigPanel
		JPanel jpBigPanel = new JPanel(new GridLayout(2,0));
		
		// Options
		JPanel jpOptions = new JPanel(new GridLayout(4,2));
		JLabel label = new JLabel("blabla"); 
		jpOptions.add(label);

		JButton button = new JButton("blablabla");
		button.setPreferredSize(new Dimension( 200, 40));
		jpOptions.add(button);
			
		JRadioButton[] rbOptions = new JRadioButton[6];
		ButtonGroup rbGroup = new ButtonGroup();
		for(int cnt=0;cnt<6;cnt++){
			JPanel jpRow = new JPanel(new FlowLayout(FlowLayout.LEFT));
			final int iSelectedIndex = cnt;
			rbOptions[cnt] = new JRadioButton("blabla");
			rbGroup.add(rbOptions[cnt]);
			
			// set 5. separator as selected by default
			if(cnt == 4){
				rbOptions[cnt].setSelected(true); 
			}
			jpRow.add( rbOptions[cnt]);
			jpOptions.add(jpRow);
		}
		jpBigPanel.add(jpOptions, BorderLayout.NORTH);
		
		// Table
		JPanel jpTable = new JPanel(new FlowLayout());
		TableModel dataModel = new AbstractTableModel() {
			public int getColumnCount() { return 10; }
			public int getRowCount() { return 5;}
			public Object getValueAt(int row, int col) { return new String("-");}
		};
		JTable table = new JTable(dataModel);
		JScrollPane scrollpane = new JScrollPane(table);
		table.getTableHeader().setReorderingAllowed( false );
      	table.setBackground(jpTable.getBackground());
        table.setPreferredScrollableViewportSize(new Dimension(500, 80));
        table.setBorder(BorderFactory.createRaisedBevelBorder());
        table.setOpaque(true); 
        JScrollPane scrollPane = new JScrollPane(table);
        scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
        jpTable.add(scrollPane);
		jpBigPanel.add(jpTable, BorderLayout.SOUTH);
	
		jpBigPanel.setBorder(BorderFactory.createRaisedBevelBorder());
		return jpBigPanel;
	}
	
	
	private JPanel drawSmallPanel(){
		// SmallPanel
		JPanel jpSmallPanel = new JPanel(new GridLayout(2,1));
		
		// jp1
		JPanel jp1 = new JPanel( new GridLayout(1,2));
		JLabel label1 = new JLabel("blablabla");
		jp1.add(label1);
		
		JButton button = new JButton("blabla");
		button.setPreferredSize(new Dimension( 200, 40));
		jp1.add(button);
		jpSmallPanel.add(jp1);
		
		// LoadPath
		JLabel label2 = new JLabel("bla/bla/bla");	
		jpSmallPanel.add(label2, BorderLayout.SOUTH);

		jpSmallPanel.setBorder(BorderFactory.createRaisedBevelBorder());
		return jpSmallPanel;
	}

	/////////////////////////////////////////////////////////////
	public static void main(String[] args){
		SeparatorPanel Sepp = new SeparatorPanel();
	}
}
 

Corcovado

Bekanntes Mitglied
Jetz hab ich das oben mal editiert, ich hoffe es ist so gemeint gewesen - jetz hab ich noch eine andere Frage, was ist denn der Unterschied zwischen dem directen add() und dem getContentPane().add(), warum ist denn letzteres anscheinend besser/richtiger?
 

KSG9|sebastian

Top Contributor
weil auf nem JFrame ein ContentPane liegt (auch ein JPanel) und die Elemente werden nicht auf das JFrame gesetzt sondern auf die ContentPane (= JPanel).
 

Corcovado

Bekanntes Mitglied
Nein - eigentlich gab es auch keinen Unterschied zwischen "mit ContentPane" und "mit ohne ContentPane", das habe ich aber auch nicht erwartet. Naja, es leuchtet ein, dass es wohl irgendwelche Vorteile haben muss, wenn die Java-Entwickler einem in JFrame schon ein Panel (naemlich ContentPane ) zur Verfuegung stellen. Das ContentPane ein Panel ist hab ich nun auch in der API gelesen, ich sehe ein, dass es umstaendlich ist wenn man das umgeht, indem man ein zusaetzliches Panel erzeugt (oder das wird doch quasi gemacht, indem man einfach nur added?!) bzw die vorhandenen Mittel mit dem damit erzeugten eigenen Overhead nun ungenutzt laesst. Welche Vorteile/Nachteile es genau hat soll aber nun nich das Thema werden -> ich habe immer noch mein Problem ;)

Gut also Mein JFrame, beinhaltet nun smallPanel und bigPanel. Jedoch sind beide gleich gross. Ich will aber das SmallPanel seine Hoehe behaelt und nur die Breite von BigPanel annimmt. Man sieht das ganz gut wenn mans mal so laufen laesst und dann, wie auch schon oben beschrieben einfach nur die Panels einzeln laufen laesst.


Fragen:
Wie kann ich SmallPanel und BigPanel vereinen, sodass sie ihre Hoehe behalten, aber beide die Breite von BigPanel haben?

Wo kommt der sinnlose leere Raum unter der Tabelle her, wie mach ich das weg?

Wie quetsche ich die Radiobuttons etwas mehr zusammen, dabei darf das Panel ruhig etwas kleiner werden, aber der Button sollte halt menschengerecht bleiben, also nicht auf Ameisengroesse schrumpfen oder zum Elefanten werden?
Danke schon mal
 

Snape

Bekanntes Mitglied
Corcovado hat gesagt.:
Fragen:
Wie kann ich SmallPanel und BigPanel vereinen, sodass sie ihre Hoehe behalten, aber beide die Breite von BigPanel haben?

Wo kommt der sinnlose leere Raum unter der Tabelle her, wie mach ich das weg?

Wie quetsche ich die Radiobuttons etwas mehr zusammen, dabei darf das Panel ruhig etwas kleiner werden, aber der Button sollte halt menschengerecht bleiben, also nicht auf Ameisengroesse schrumpfen oder zum Elefanten werden?
Danke schon mal

Die Antwort auf alle diese Fragen lässt sich einfach formulieren:
Mit dem richtigen Layoutmanager und den entsprechenden Ausrichtungen, Ausdehungen, Verankerungen.
 

Corcovado

Bekanntes Mitglied
Ach so is das !! - das is ja wie mit den Lottozahlen, man muss halt einfach nur die richtigen ankreuzen...sry fuer die Frage, da haette ich ja auch gleich selber drauf kommen koennen - mein Gott steh ich heute wieder auf der Leitung...
 

Snape

Bekanntes Mitglied
Na gut, dann eben konkret:
GridLayout und FlowLayout eignen sich nicht sonderlich für gewollte und beabsichtigte Ausrichtungen und Ausdehungen. Nimm das GridBagLayout und alles wird gut.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben