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:
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);
}
}