Swing GridBag-Probleme (Größe und Ausrichtung)

cyclohexan

Mitglied
Hallo,

ich habe einen JDialog mit GridBagLayout und einem versteckten Container irgendwo in der Mitte, der sich bei Bedarf anzeigen lässt.
Am Anfang ist der Container versteckt und nimmt keinen Platz weg, was auch so sein soll. Durch Klick auf einen Button lässt er sich anzeigen und wieder verstecken.

Dabei habe ich die beiden folgenden Probleme:
1. Wenn der Container angezeigt wird und entsprechend Platz braucht, wird das Fenster nicht automatisch mit vergrößert. Oben und unten werden Teile der anderen Elemente abgeschnitten.
2. Wenn ich den Container dann manuell mit der Maus vergrößere, passt alles hinein. Wenn ich den Container dann aber wieder verstecke, wird der Rest zentriert angeordnet. D.h. die Elemente über dem versteckten Container springen nach unten, die unten springen nach oben. Ich hätte lieber alles dauerhaft oben, und falls zu viel Platz da ist, soll die Freifläche unten sein.

Bezüglich des 1. Problems habe ich es schon erfolglos mit repaint() probiert.
Notfalls könnte ich auch ganz unten eine Freifläche einfügen und diese beim ersten Sichtbarmachen des versteckten Containers für immer verschwinden lassen. Das würde zumindest sicherstellen, dass das Fenster von Anfang an groß genug ist. Wäre aber irgendwie unelegant.
Das 2. Problem habe ich versucht, über die GridBagConstraints mit anchor = GridBagConstraints.NORTH zu lösen.
Hat leider auch nichts gebracht.

Hier eine lauffähige Klasse, die das Problem demonstriert:

Java:
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class ProblemDemo extends JDialog implements ActionListener {
	
	private Container content;
	private JPanel invisibleArea;
	
	public ProblemDemo() {
		content = getContentPane();
		
		// layout
		GridBagLayout layout = new GridBagLayout();
		content.setLayout( layout );
		GridBagConstraints constraints = new GridBagConstraints();
		constraints.fill   = GridBagConstraints.BOTH;
		constraints.insets = new Insets( 2, 2, 2, 2 );
		constraints.gridx = 0;
		constraints.gridy = 0;
		constraints.gridheight = 1;
		constraints.gridwidth  = 1;
		
		// add label
		JLabel topLabel = new JLabel("Top Label");
		content.add(topLabel, constraints);
		
		// button
		constraints.gridy++;
		JButton button = new JButton("Show/Hide");
		button.addActionListener(this);
		content.add(button, constraints);
		
		// invisible area
		constraints.gridy++;
		invisibleArea = new JPanel();
		invisibleArea.setBorder( BorderFactory.createEtchedBorder() );
		JLabel hiddenLabel = new JLabel("hidden text");
		invisibleArea.setVisible(false);
		invisibleArea.add(hiddenLabel);
		content.add(invisibleArea, constraints);
		
		// add label
		constraints.gridy++;
		JLabel bottomLabel = new JLabel("Bottom Label");
		content.add(bottomLabel, constraints);
		
		pack();
		setVisible( true );
	}
	
	public static void main ( String[] args ){
		new ProblemDemo();
	}

	public void actionPerformed(ActionEvent e) {
		if ( invisibleArea.isVisible() )
			invisibleArea.setVisible(false);
		else
			invisibleArea.setVisible(true);
	}
}
 
ruf mal pack und revalidate auf das Fenster auf nach dem sichtbar/unsichtbar machen. Wobei es wahrscheinlich besser wäre das pack wegzulassen und das Fenster von Anfang an groß genug zu machen.
 
Hey, vielen Dank, pack() hat geholfen.
Ein revalidate() gibt es allerdings nicht, nur ein validate(), und das war nicht nötig.

Warum meinst du, dass es besser wäre, pack() wegzulassen?
 
Strimmt, das validate wird ja automatisch durch das pack gemacht, hatte ich vergessen, deswegen bringt es nichts. Falls du aber das pack weglässt brauchst du das validate wieder.

Ob man das pack weglassen will kommt auf die GUI und den User drauf an, das Problem ist dann ja nämlich das die Fenstergröße die eventuell vom User per Hand verändert wurde einfach per Buttondruck wieder verändert wird was eventuell nervig sein könnte, aber wie gesagt kommt drauf an und ist Geschmackssache.
 

Neue Themen


Zurück
Oben