# GUI JPanel zur Laufzeit austauschen.



## joern1 (14. Okt 2007)

Moin,

ich habe mal ne Frage zum Austauschen eines Panels.

Ich habe eine zusammengesetzte GUI , die aus mehreren Panels besteht.

Dann setze ich diese in der Klasse MainView zusammen.


```
public void initialize(){
		   
              //Initialisierung 
		      final HeadView head = new HeadView(); 
		      final MiddleView middle = new MiddleView(); 
		      final View v = new View();
		      
		      JLabel leer  = new JLabel("      ");
		      JLabel leer1 = new JLabel("      ");
		       
		      final BorderLayout layout = new BorderLayout(); 
		      setLayout(layout); 
		      
		      add(head, BorderLayout.NORTH); 
		      add(v, BorderLayout.CENTER); 
		      add(middle, BorderLayout.SOUTH); 
		      add(leer, BorderLayout.EAST); 
		      add(leer1, BorderLayout.WEST);
		   
		   
		   
	   }
```

Nun möchte ich über ein Menü das Panel, welches sich in der Mitte befindet austauschen.


Wie stell ich das am besten an?

Hab es so versucht, dass ich die Klasse MainView in der Klasse Menu  aufrufe.

Mainview main;


und dann

if (source == jj1) {



	PersonalErfassen  pers = new PersonalErfassen();
	main.add(pers, BorderLayout.CENTER);
	main.validate();
	}

Aber das läuft nicht..


Danke

VG
Jörn


----------



## Marco13 (14. Okt 2007)

Evtl. musst du noch ein 
main.remove(v)
machen, bevor du das
main.add(neuesPanel, BorderLayout.CENTER)
machst.

Die (häufig "schönere") Alternative wäre ein CardLayout. 

Wie äußert sich denn das "nicht funktionieren"? Schreib ggf. mal ein compilierbares, alleine lauffähiges Beispiel.


----------



## joern1 (14. Okt 2007)

Hallo Marco,

OK. Card Layout werde ich mir noch einmal detailliert ansehen.
Es ist so, dass ich verschiedene Layoutmanager nutze


Hier mal ein grob vereinfachtes Beispiel:

Der nachstehende Code ist ein Teil meiner Main View, die mehrere Panels beinhaltet.
Die View soll hier durch die Klasse View2 ersetzt werden.


```
import java.awt.GridLayout;


import javax.swing.JButton;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;



public class View extends JPanel{
	
	JLabel Text11;
	JLabel Ausgabe; 
	JButton b1;


	 private JTextField field;	    

	
	
	
	public View(){
	 
	
		
		GridLayout layout = new GridLayout(3, 1); 
	      setLayout(layout); 
	       
	      JButton button = new JButton( "Irgendetwas" ); 
                      add(button);
	   
                       field = new JTextField(); 
	      field.setText( "Es ist noch nichts geschehen" ); 
                     add(field);

	     Text11 = new JLabel("Daten aus der View1");
	       add(Text11);
	     
	       
	     
	        
	}//Konstruktor
	
}
```


Diese View will ich durch die Klasse View2 ersetzen:



```
import javax.swing.JButton;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;



public class View2 extends JPanel{
	
	JLabel Text11;
	JLabel Ausgabe; 
	JButton b1;

	
	String daten; 

	 private JTextField field = new JTextField(); 
	    

	
	
	
	public View2(){
	 
	
		
		GridLayout layout = new GridLayout(3, 1); 
	      setLayout(layout); 
	       
	      JButton button = new JButton( "Ganz anderes" ); 
                      add(button);
	   
                       field = new JTextField(); 
	      field.setText( "Ich bin jetzt die View 2" ); 
                     add(field);

	     Text11 = new JLabel("Daten aus der View2");
	       add(Text11);
	     
	       
	     
	        
	}//Konstruktor
	
}
```



Alle Panles werden in der MainView zusammengefasst:


```
import javax.swing.*;
import javax.swing.border.EtchedBorder;
import java.awt.BorderLayout;

public class MainView extends JPanel { 

	
	
	   public MainView() { 
		  
		   
		   this.setBorder( BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));

		   
		   initialize();
		   
	       

	   } //Konstruktor
	   
	   
	   
	   public void initialize(){
		   
              //Initialisierung 
		     // final HeadView head = new HeadView(); 
		     // final MiddleView middle = new MiddleView(); 
		      final View v = new View();
		      
		      
		       
		      final BorderLayout layout = new BorderLayout(); 
		      setLayout(layout); 
		      
		      //add(head, BorderLayout.NORTH); 
		      add(v, BorderLayout.CENTER); 
		      //add(middle, BorderLayout.SOUTH); 
		      
		   
		   
		   
	   }
	   
	   
	}
```

So, nun wird die Mainiew im Hauptframe aufgerufen. Hier wird ebenfalls das Menue implementiert, über das
die Änderung gemacht werden soll.



```
import javax.swing.*;

import java.awt.BorderLayout;
import java.awt.Color;

public class MainFrame extends JFrame { 
	
	

	   public MainFrame() { 
	      
	Menu menu = new Menu();
	setJMenuBar(menu);
	      this.setSize(900,600); 
	      BorderLayout layout = new BorderLayout(); 
	      getContentPane().setLayout(layout); 
	      setResizable(false);  
	      MainView  main = new MainView(); 
	      getContentPane().add(main, BorderLayout.CENTER); 

 
	   } 
	   
	   public static void main (String args[]){
		   
		   MainFrame frame = new MainFrame(); 
		      frame.setVisible(true);  
	
		  
		   
	   }
	   
	}
```

Hier das Beispielmenue:


```
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.ActionListener;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class Menu extends JMenuBar implements ActionListener {
	
	MainView  content1;
	
	//Dropdown Menü
	JMenu menu; 

//	Menüeinträge Personal
	JMenuItem j1 = new JMenuItem("Mitarbeiter anlegen");

public Menu(){
		
	menu  = new JMenu("Programm");
      menu.add(j1);
      j1.addActionListener(this);

   }


public void actionPerformed( ActionEvent e) {
		
		final Object source = e.getSource(); 
		
		
		if (source == jj1) {
			
			//content1.removeAll();
			//content1.remove(v);
			content1.setBackground(Color.RED);
			//PersonalErfassen  pers = new PersonalErfassen();
			//content1.add(pers, BorderLayout.CENTER);
			//content1.validate();
			}
}
```


Ich hoffe, dies sit anschaulich....


Viele Grüße


----------



## Marco13 (14. Okt 2007)

.... "anschaulich" ...    *seufz* ... naja. Hier ist die Lösung. Die ist ungefähr genauso anschalich wie deine Fragestellung.

```
import java.awt.GridLayout;
import javax.swing.*;
import javax.swing.border.EtchedBorder;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.ActionListener;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import javax.swing.*;

import java.awt.BorderLayout;
import java.awt.Color;





public class MainFrame extends JFrame {



      public MainFrame() {

         this.setSize(900,600);
         BorderLayout layout = new BorderLayout();
         getContentPane().setLayout(layout);
         setResizable(false);
         MainView  main = new MainView();
   XMenu menu = new XMenu(main);
   setJMenuBar(menu);
         getContentPane().add(main, BorderLayout.CENTER);


      }

      public static void main (String args[]){

         MainFrame frame = new MainFrame();
            frame.setVisible(true);



      }

   }



class MainView extends JPanel {



      public MainView() {


         this.setBorder( BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));


         initialize();



      } //Konstruktor

            final View v = new View();
            final View2 v2 = new View2();


      public void initialize(){

              //Initialisierung
           // final HeadView head = new HeadView();
           // final MiddleView middle = new MiddleView();



            final BorderLayout layout = new BorderLayout();
            setLayout(layout);

            //add(head, BorderLayout.NORTH);
            add(v, BorderLayout.CENTER);
            //add(middle, BorderLayout.SOUTH);




      }

        public void tausche()
        {
            remove(v);
            add(v2);
            validate();
        }

   }


class XMenu extends JMenuBar implements ActionListener {

   MainView  content1;

   //Dropdown Menü
   JMenu menu;

//   Menüeinträge Personal
   JMenuItem j1 = new JMenuItem("Mitarbeiter anlegen");

public XMenu(MainView mainView){

content1 = mainView;
   menu  = new JMenu("Programm");
      menu.add(j1);
      j1.addActionListener(this);
        add(menu);
   }


public void actionPerformed( ActionEvent e) {

      final Object source = e.getSource();


      if (source == j1) {
        content1.tausche();
         //content1.removeAll();
         //content1.remove(v);
         //content1.setBackground(Color.RED);
         //PersonalErfassen  pers = new PersonalErfassen();
         //content1.add(pers, BorderLayout.CENTER);
         //content1.validate();
         }
}
}



class View extends JPanel{

   JLabel Text11;
   JLabel Ausgabe;
   JButton b1;


    private JTextField field;




   public View(){



      GridLayout layout = new GridLayout(3, 1);
         setLayout(layout);

         JButton button = new JButton( "Irgendetwas" );
                      add(button);

                       field = new JTextField();
         field.setText( "Es ist noch nichts geschehen" );
                     add(field);

        Text11 = new JLabel("Daten aus der View1");
          add(Text11);




   }//Konstruktor

}

class View2 extends JPanel{

   JLabel Text11;
   JLabel Ausgabe;
   JButton b1;


   String daten;

    private JTextField field = new JTextField();





   public View2(){



      GridLayout layout = new GridLayout(3, 1);
         setLayout(layout);

         JButton button = new JButton( "Ganz anderes" );
                      add(button);

                       field = new JTextField();
         field.setText( "Ich bin jetzt die View 2" );
                     add(field);

        Text11 = new JLabel("Daten aus der View2");
          add(Text11);




   }//Konstruktor

}
```


----------



## joern1 (15. Okt 2007)

Hallo Marco,

entschuldige mein krudes Beispiel.
Ich danke Dir sehr. So funktioniert es schon einmal echt super. :applaus: 

Ich frage mich bloß, ob die Vorgehensweise in Ordnung ist, oder ob man es vielleicht
vom Entwurf her korrekter machen könnte. 

Vielleicht mit einem Interface bzw. wie wäre es denn, wenn die Navigation über einen
eigenen Controller/ Observer liefe?


Viele Grüße


----------



## Marco13 (15. Okt 2007)

Die Vorgehensweise an sich ist OK - ein CardLayout wäre aber vmtl. besser. Trotzdem.... normalerweise bin ich ja ein Verfechter von "vielen Klassen" - zumindest sind 10 Klassen a 100 Zeilen i.a. besser als eine Klasse mit 1000 Zeilen. Aber eine eigene Klasse von JMenu, JPanel etc. zu erben, NUR um dort irgendwelche Components hinzuzufügen, ist IMHO nicht so sinnvoll. 
Da die View-Klassen vermutlich noch erweitert werden, brauchst du zumindest die Views schonmal nicht rauszumachen, aber das mit dem Menu sieht schon strange aus  :? Vermutlich könnte man dann auch das _Umschalten_ an sich besser machen, weil man die Haupt-View nicht ans Menu übergeben müßte und so....


----------



## Guest (15. Okt 2007)

Ich habe mich nun ausführlich mit dem CardLayout beschäftigt.

Meine View ist ist in erster Linie ein Formular mit vielen JTextFields.
Dafür eignet sich eigentlich das GridBagLayout am Besten.

Ich müßte dann den Panel mit dem Gridbaglayout noch in einen Panel mit einem CardLayout legen ?!

Der Vorteil wäre wohl das Navigieren, denn die Cards liegen alle übereinader und ich muss nur
sagen,welche den gerade oben liegen soll. 

Ich würde es dann trotzdem so machen, dass ich für jede Seite eine eigene Klasse schreibe. 
Der Übersicht halber, dann im MainFrame ein CardLayout und alle Seite hinein. 

Ich denke so in etwa war das von Dir gemeint gell ...

VG

[/img]


----------

