GroupLayout - Elemente aus/einblenden

hansmueller

Mitglied
Hallo,

ich habe Probleme mit dem Ein- und Ausblenden von Elementen bei einem GroupLayout.

So soll die Darstellung sein:
Eine Liste mit 2 Spalten und mehreren Zeilen.
In der ersten Spalte kommen die Jlabels und in die zweite Spalte die dazugehörigen JComboBoxen.
Wichtig ist die erste Zeile. Die darin enthaltene JComboBox hat zwei Einträge.
Wenn der erste Eintrag angezeigt wird, ist die komplette Liste sichtbar.
Wenn der zweite Eintrag angezeigt wird, ist nur noch die erste Zeile sichtbar. Die anderen Zeilen werden ausgeblendet.
Dies wird durch die Methode "Verstecken()" gemacht, welche die Elemente der restlichen Zeilen auf "setVisible(false)" setzt.

Die Methode "setAutoCreateGaps()" ist auf "true" gestellt. (Ich finde die automatischen Abstände sehen gut aus.)

Hier der Quellcode zum Versuchsprogramm01:

Die MainProg-Klasse:
Code:
public class MainProg
{
	public static void main(String[] args)
	{
		GUI x = new GUI();
	}
}

und die GUI-Klasse:
Code:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.GroupLayout;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.GroupLayout.Alignment;

public class GUI implements ActionListener
{	
	JFrame frmFenster;
	JPanel pnlDarstellung;
	JLabel lb1, lb2, lb3, lb4;
	JComboBox cb1, cb2, cb3, cb4;
	GroupLayout layout;
	
	public GUI()
	{
		frmFenster = new JFrame();
		frmFenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frmFenster.setLayout(new BoxLayout(frmFenster.getContentPane(), BoxLayout.Y_AXIS));
		
		pnlDarstellung = new JPanel();
		
		layout = new GroupLayout(pnlDarstellung);
		
		pnlDarstellung.setLayout(layout);
		
		lb1 = new JLabel("Text 1");
		lb2 = new JLabel("Text 2");
		lb3 = new JLabel("Text 3 Text3");
		lb4 = new JLabel("Text 4");
		
		cb1 = new JComboBox();
		cb1.addItem("Anzeige 1");
		cb1.addItem("Anzeige 2");
		cb1.addActionListener(this);
		
		cb2 = new JComboBox();
		cb2.addItem("TEST");
		cb3 = new JComboBox();
		cb3.addItem("TEST");
		cb4 = new JComboBox();
		cb4.addItem("TEST");
				
		layout.setHorizontalGroup(layout.createParallelGroup()
					.addGroup(layout.createSequentialGroup()
							.addComponent(lb1)
							.addComponent(cb1))
					.addGroup(layout.createSequentialGroup()
							.addComponent(lb2)
							.addComponent(cb2))
					.addGroup(layout.createSequentialGroup()
							.addComponent(lb3)
							.addComponent(cb3))
					.addGroup(layout.createSequentialGroup()
							.addComponent(lb4)
							.addComponent(cb4)));
					
		layout.setVerticalGroup(layout.createSequentialGroup()
					.addGap(3)
					.addGroup(layout.createParallelGroup(Alignment.BASELINE)
							.addComponent(lb1)
							.addComponent(cb1))
					.addGroup(layout.createParallelGroup(Alignment.BASELINE)
							.addComponent(lb2)
							.addComponent(cb2))
					.addGroup(layout.createParallelGroup(Alignment.BASELINE)
							.addComponent(lb3)
							.addComponent(cb3))
					.addGroup(layout.createParallelGroup(Alignment.BASELINE)
							.addComponent(lb4)
							.addComponent(cb4))
					.addGap(3));
		
		layout.linkSize(lb1, lb2, lb3, lb4);
		
		layout.setAutoCreateGaps(true);
		
		frmFenster.add(pnlDarstellung);
		
		frmFenster.pack();
		frmFenster.setVisible(true);
	}
	
	public void Verstecken()
	{
		if(cb1.getSelectedItem() == "Anzeige 2")
		{
			lb2.setVisible(false);
			cb2.setVisible(false);
			lb3.setVisible(false);
			cb3.setVisible(false);
			lb4.setVisible(false);
			cb4.setVisible(false);
		}
		else
		{
			lb2.setVisible(true);
			cb2.setVisible(true);
			lb3.setVisible(true);
			cb3.setVisible(true);
			lb4.setVisible(true);
			cb4.setVisible(true);
		}
	}
	
	public void Fensterneumalen()
	{
		frmFenster.pack();
		frmFenster.repaint();
	}

	@Override
	public void actionPerformed(ActionEvent e)
	{
		if(e.getSource() == cb1)
		{
			Verstecken();
			Fensterneumalen();
		}
	}
}

Das Problem ist jetzt, daß wenn die Elemente ausgeblendet werden, die "Gaps" weiter bestehen bleiben und einen unschönen Abstand nach der ersten Zeile bilden.

Ist das ein Fehler der Klasse GroupLayout oder habe ich irgendetwas nicht berücksichtigt?

Wie würdet Ihr das Problem lösen?


Ich war natürlich nicht faul und habe ein paar Sachen ausprobiert.
Eine Idee war für beide Darstellungen jeweils ein eigenes GroupLayout zu erstellen.
Diesmal wird über die Methode "Verstecken()" das Layout ausgewechselt.

Hier der Quellcode zum Versuchsprogramm02:

Für die MainProg-Klasse:
Code:
public class MainProg
{
	public static void main(String[] args)
	{
		GUI x = new GUI();
	}
}

und die GUI-Klasse:
Code:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.GroupLayout;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.GroupLayout.Alignment;

public class GUI implements ActionListener
{
	JFrame frmFenster;
	
	JPanel pnlDarstellung;
	JLabel lb1, lb2, lb3, lb4;
	JComboBox cb1, cb2, cb3, cb4;
	
	GroupLayout layout;
	GroupLayout.Group hgGross, hgKlein, vgGross, vgKlein;
	
	public GUI()
	{
		frmFenster = new JFrame();
		frmFenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		frmFenster.setLayout(new BoxLayout(frmFenster.getContentPane(), BoxLayout.Y_AXIS));
		
		pnlDarstellung = new JPanel();
		
		layout = new GroupLayout(pnlDarstellung);
		
		pnlDarstellung.setLayout(layout);
		
		lb1 = new JLabel("Text 1");
		lb2 = new JLabel("Text 2");
		lb3 = new JLabel("Text 3 Text3");
		lb4 = new JLabel("Text 4");
		
		cb1 = new JComboBox();
		cb1.addItem("Anzeige 1");
		cb1.addItem("Anzeige 2");
		cb1.addActionListener(this);
		
		cb2 = new JComboBox();
		cb2.addItem("TEST");
		cb3 = new JComboBox();
		cb3.addItem("TEST");
		cb4 = new JComboBox();
		cb4.addItem("TEST");
				
		hgGross = layout.createParallelGroup()
					.addGroup(layout.createSequentialGroup()
							.addComponent(lb1)
							.addComponent(cb1))
					.addGroup(layout.createSequentialGroup()
							.addComponent(lb2)
							.addComponent(cb2))
					.addGroup(layout.createSequentialGroup()
							.addComponent(lb3)
							.addComponent(cb3))
					.addGroup(layout.createSequentialGroup()
							.addComponent(lb4)
							.addComponent(cb4));
		
		hgKlein = layout.createParallelGroup()
					.addGroup(layout.createSequentialGroup()
							.addComponent(lb1)
							.addComponent(cb1));
				
		vgGross = layout.createSequentialGroup()
					.addGap(20)
					.addGroup(layout.createParallelGroup(Alignment.BASELINE)
							.addComponent(lb1)
							.addComponent(cb1))
					.addGroup(layout.createParallelGroup(Alignment.BASELINE)
							.addComponent(lb2)
							.addComponent(cb2))
					.addGroup(layout.createParallelGroup(Alignment.BASELINE)
							.addComponent(lb3)
							.addComponent(cb3))
					.addGroup(layout.createParallelGroup(Alignment.BASELINE)
							.addComponent(lb4)
							.addComponent(cb4))
					.addGap(20);
					
		vgKlein = layout.createSequentialGroup()
					.addGap(20)
					.addGroup(layout.createParallelGroup(Alignment.BASELINE)
							.addComponent(lb1)
							.addComponent(cb1))
					.addGap(20);
				
		layout.setHorizontalGroup(hgGross);
		layout.setVerticalGroup(vgGross);
		
		layout.linkSize(lb1, lb2, lb3, lb4);
		
		layout.setAutoCreateGaps(true);
		
		frmFenster.add(pnlDarstellung);
		
		frmFenster.pack();
		frmFenster.setVisible(true);
		
	}
	
	public void Verstecken()
	{
		if(cb1.getSelectedItem() == "Anzeige 2")
		{
			layout.setHorizontalGroup(hgKlein);
			layout.setVerticalGroup(vgKlein);
		}
		else
		{
			layout.setHorizontalGroup(hgGross);
			layout.setVerticalGroup(vgGross);
		}
	}
	
	public void Fensterneumalen()
	{
		frmFenster.pack();
		frmFenster.repaint();
	}

	@Override
	public void actionPerformed(ActionEvent e)
	{
		if(e.getSource() == cb1)
		{
			Verstecken();
			Fensterneumalen();
		}
	}
}

Aber das funktioniert auch nicht richtig. :(

Wo ist hier mein Denkfehler? Was mache ich falsch?

Ich könnte natürlich einfach auf einen anderen Layout-Manager ausweichen, aber mir geht es darum zu verstehen "warum" es nicht funktioniert.

Ich bedanke mich schon im Voraus für eure Hilfe.
 
Zurück