GridBagLayout

Dagobert

Bekanntes Mitglied
Guten Morgen liebes Forum,
Ich hab gerade ein Problem mit dem GridbagLayout.
Ich habe ein Panel, das mehrere Sub-Panels beinhaltet. Jetzt möchte ich gerne das die Sub-Panels von oben nach unten angezeigt werden. Solange ich mehr Inhalt als Fläche habe klappt dies auch super, nur bei weniger Inhalt fängt es an herum zu zicken. Der Inhalt wird dann in der Mitte angezeigt anstatt oben links zu beginnen.
Welches anchor muss ich benutzen? oO
Java:
private void displayResults(final JPanel panel, int y) {
		GridBagConstraints c;
		
		if (displayHeader) {
			JLabel titelLabel;
			titelLabel = new JLabel("<html>Suche: <i>'" + searchword + "'</i></html>'");
			titelLabel.setFont(new Font("Serif", Font.BOLD, 17));
			c = new GridBagConstraints();
			c.gridy = ++y;
			c.gridwidth = 3;
			c.fill = GridBagConstraints.NONE;
			c.weightx = 0;
			c.weighty = 0;
			c.anchor = GridBagConstraints.NORTH;
			c.insets = center;
			panel.add(titelLabel, c);
		}

		for (Concept result : resultlist) {
			SearchConceptPanel tmp = new SearchConceptPanel(result);
			tmp.setBorder(normal);
			tmp.addMouseListener(this);
			c = new GridBagConstraints();
			c.gridy = ++	y;
			c.fill = GridBagConstraints.BOTH;
			c.anchor = GridBagConstraints.NORTHWEST;
			c.weightx = 1.0;
			c.weighty = 0.0;
			c.insets = center;
			panel.add(tmp, c);
		}
	}
attachment.php


mfg. Dagobert
 
Zuletzt bearbeitet von einem Moderator:
Da die Grafik auf meinem Lappy angezeigt wird, auf dem Rechner in der Uni jedoch nicht, hänge ich sie zur Sicherheit nochmals dran
attachment.php


mfg. Dagobert
 

Anhänge

  • problem.png
    problem.png
    9,9 KB · Aufrufe: 53
Machst du nachdem du die ganzen Panels hinzufügst ein revalidate()?
Allgemein finde ich es nicht so schön, zur laufzeit Komponenten zusammenzubauen. Dein Ergebnis könntest du mit einer JList und passendem Renderer beispielsweise auch erreichen - einfach aus dem SearchConceptPanel einen ListCellRenderer machen und eine passende setResult() Methode schreiben.
 
Machst du nachdem du die ganzen Panels hinzufügst ein revalidate()?
Nein, da ich erst nachdem alle Panels hinzugefügt sind validiere.
[JAVA=78]/**
* init the GUI
*/
public void initGUI() {
final JPanel panel = new JPanel();
GridBagConstraints c;
final GridBagLayout gbl = new GridBagLayout();
panel.setLayout(gbl);
setLayout(gbl);

int y = 0;

if (!resultlist.iterator().hasNext()) {
// <----- if no result to display ----->
displayNoResults(panel, y);
} else {
// <----- if there is a result to display ----->
displayResults(panel, y);
}

final JScrollPane scroll = new JScrollPane();
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
scroll.setViewportView(panel);
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.weightx = 1.0;
c.weighty = 1.0;
c.fill = GridBagConstraints.BOTH;
c.anchor = GridBagConstraints.CENTER;
add(scroll, c);

backButton = new JButton(mc.getString("back"));
backButton.setActionCommand("back");
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 1;
c.anchor = GridBagConstraints.CENTER;
c.fill = GridBagConstraints.NONE;
add(backButton, c);

validate();
}[/code]

Dein Ergebnis könntest du mit einer JList und passendem Renderer beispielsweise auch erreichen
Ja aber eigentlich mache ich ja nichts anderes. Die Panels machen ja auch nix anderes als die Sachen zu rendern...

mfg. Dagobert
 
Nein, die Panels rendern nicht nur sondern sind eigene Komponenten mit dem ganzen Overhead und den ganzen Bedürfnissen nach Layoutanweisungen 🙂. Ein Renderer hält nur eine Komponente welche einfach mehrmals gezeichnet wird - ein bisschen wie ein Stempel.
Ich bin jetzt nicht so top im Gridbaglayout aber versuch mal den anchor vom Scrollpane auf NORTH zu setzen.
 
Ja da hast du wohl recht =)

Naja GridbagConstraints.NORTH bringt leider nix, da das Panel eigentlich eh Bildschirm-füllend ist, sollte das auch egal sein.

mfg. Dagobert
 
Warum schaut ihr nicht einfach in die FAQ, da gibt's ein gutes Tutorial zum GridBagLayout.
Weil ich denke das ich das GridBagLayout mittlerweile ganz gut verstehe (und ich nicht damit rechne das solle "speziellen" Probleme in der FAQ stehen 😉). Jedoch zickt es manchmal herum, so wie hier. Warum muss ich ihm den sagen es soll sich ausbreiten soll, wenn ich nur will das es nach oben wandert?! Das klingt für mich nicht sehr logisch 😉
Jo Tatsache. Was ich dazu denke steht drüber 😀
Danke für die Mühe =)
Hier ist mal die Lösung:
[JAVA=155]private void displayResults(final JPanel panel, int y) {
GridBagConstraints c;

if (displayHeader) {
JLabel titelLabel;
titelLabel = new JLabel("<html>Suche: <i>'" + searchword + "'</i></html>'");
titelLabel.setFont(new Font("Serif", Font.BOLD, 17));
c = new GridBagConstraints();
c.gridy = ++y;
c.gridwidth = 3;
c.fill = GridBagConstraints.NONE;
c.weightx = 0;
c.weighty = 0.0;
c.anchor = GridBagConstraints.NORTH;
c.insets = center;
panel.add(titelLabel, c);
}

for (Concept result : resultlist) {
SearchConceptPanel tmp = new SearchConceptPanel(result);
tmp.setBorder(normal);
tmp.addMouseListener(this);
c = new GridBagConstraints();
c.gridy = ++ y;
c.fill = GridBagConstraints.HORIZONTAL;
c.anchor = GridBagConstraints.NORTH;
c.weightx = 1.0;
c.weighty = 1.0;
c.insets = center;
panel.add(tmp, c);
}
}[/code]

mfg. Dagobert
 
Weil ich denke das ich das GridBagLayout mittlerweile ganz gut verstehe (und ich nicht damit rechne das solle "speziellen" Probleme in der FAQ stehen 😉).
...
Warum muss ich ihm den sagen es soll sich ausbreiten soll, wenn ich nur will das es nach oben wandert?!
Sieht wohl so aus, als wenn du das [JAPI]GridBagLayout[/JAPI] doch noch nicht ganz so verstanden hast? 😉 Denn so speziell sind deine Probleme mit dem GridBagLayout nicht!
Um Komponenten in eine Richtung zu orientieren/verschieben wird das Attribut
Code:
anchor
benutzt.
Um Komponenten auszudehnen (über ihre PreferredSize hinaus) wird das Attribut
Code:
fill
benutzt.
Um Komponenten eine Gewichtung im Layout zu verschaffen, die eine Aussage darüber macht, wie stark sich die eingestellten [JAPI]GridBagConstraints[/JAPI] auf eine oder mehrere Komponenten auswirken sollen, gibts die Attribute
Code:
weightx
für die horizontale und
Code:
weighty
für die vertikale Achse im Layout.

Aber das hätte man alles in der FAQ nachlesen können... :bahnhof:
 

Zurück
Oben