GUIs miteinander verknüpfen

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo!

Ich hab folgendes Problem: Ich hab ein paar GUIs auf ein paar Klassen aufgeteilt, die jeweils alle JPanel erweitern; z.B. Login, Menu, bla bla bla

In meiner Hauptklasse sollen nun diese Panels ausgetauscht werden, z.B. nach Klick auf Login-Button soll die Login-Gui angezeigt werden.

Bis jetzt hab ich immer das alte Panel gelöscht und eine neue Instanz vom Login-Panel eingefügt. Das Problem dabei ist, dass ich nicht gespeicherte Daten verliere, wenn ich das alte Panel lösche.
Ich hab auch probiert, das alte Panel mit setVisible(false) unsichtbar zu machen, was zwar klappt, aber das neue Panel wird dann nicht angezeigt.

Hier der Code (ist eine Methode von meiner Hauptklasse):

Code:
public void setCenter(int panel)
{
    pCenter.setVisible(false);                    //Altes Center-Panel unsichtbar

    if (panel == 0)
        pCenter = login;
    else if (panel == 1)
        pCenter = menu;
    //...
    
		
    pCenter.setVisible(true);
    this.getContentPane().repaint();            //GUI aktualisieren
    this.getContentPane().validate();
}



Vielleicht kann mir jemand helfen, oder vielleicht kennt jemand eine bessere Lösung.

thx,
Espiritu
 
Jeder Container hat die Methode "remove" und "removeAll", mit dem man die Components wieder entfernen kann.
Die kannst du benutzen.
 
Vielleicht kann mir jemand helfen, oder vielleicht kennt jemand eine bessere Lösung.

Ich blende btw. meine Fenster so aus

Code:
// Dialog 1 und 2 werden erzeugt bzw. neu zugeordnet "InstanceRegistryView" gibt halt n JDialog Objekt zurück
JDialogCreateRecipe1of4 createRecipe1 = InstanceRegistryView.getInstance().getCreateRecipe1of4Instance();
JDialogCreateRecipe2of4 createRecipe2 = InstanceRegistryView.getInstance().getCreateRecipe2of4Instance();
				
createRecipe1.hide();
createRecipe2.show();

Dazu musst Du aber dann dein ausgeblendetes Fenster sichern, um wieder drauf zugreifen zu können(später mit .show evtl.). Falls Du pro Fenster nur eine Instanz benötigst kannst Du Dir ja mal das Singleton Pattern ansehn. Ich arbeite in Verbindung mit meiner GUI damit und komm so gut klar.
 
Danke!! Das Singleton-Pattern ist ideal für meine Zwecke.

In deinem Beispiel verwaltet also die InstanceRegistryView (Singleton) sämtliche Instanzen der JDialogs RecipeX (die auch wieder Singletons sind), oder?

Übrigens, beim obigen Code bin ich auch schon auf den Fehler draufgekommen:
Code:
public void setCenter(int panel) 
{ 
    pCenter.setVisible(false);            //eigentlich unnötig

    if (panel == 0) 
        pCenter = login;                     //müsste jetzt die einzige Instanz zuweisen (Singleton), also login.getInstance()
    else if (panel == 1) 
        pCenter = menu;                   //Singleton: menu.getInstance()
    //...
    
    
//Ist jetzt hinfällig. Der JFrame muss nicht aktualisiert werden, weil sich beim JFrame nichts geändert hat.
/*   
    pCenter.setVisible(true); 
    this.getContentPane().repaint();    //GUI aktualisieren 
    this.getContentPane().validate(); 
*/

    pCenter.updateUI();                    //Center-Panel aktualisieren

}


MfG,
Espiritu
 
Ergänzung bzw. Korrektur:

Code:
    if (panel == 0) 
        pCenter = login;        //müsste jetzt die einzige Instanz zuweisen (Singleton), also login.getInstance()
    else if (panel == 1) 
        pCenter = menu;        //Singleton: menu.getInstance()
    //...

Diesen Teil müsste eine zentrale "GUI-Verwaltung" (wieder ein Singleton) übernehmen.


Mfg,
Espiritu
 
Hier mal meine Singleton Klasse für meine View

Code:
import view.*;

public class InstanceRegistryView {

//	interne Referenzen
   private static InstanceRegistryView instanceRegistry = null;

   private MainFrame mainFrame = null;
   private int mainFrameCount = 0;
   
   private JMenuBarCookBookMenu menuBar = null;
   private int menuBarCount = 0;
   
   private JDialogCreateRecipe1of4 createRecipe1 = null;
   private int createRecipe1Count = 0;
   
   private JDialogCreateRecipe2of4 createRecipe2 = null;
   private int createRecipe2Count = 0;
   
   private JDialogCreateRecipe3of4 createRecipe3 = null;
   private int createRecipe3Count = 0;
   
   private JDialogCreateRecipe4of4 createRecipe4 = null;
   private int createRecipe4Count = 0;

   


   /* --- KONSTRUKTOR_1 --- */
	 private InstanceRegistryView(){
	 }

	 public static InstanceRegistryView getInstance(){
	   if(instanceRegistry == null)
		 instanceRegistry = new InstanceRegistryView();
	   return instanceRegistry;
	 }


	 public synchronized MainFrame getMainFrameInstance(){
	   if(mainFrame == null && mainFrameCount == 0){
		 mainFrameCount = 1;
		 mainFrame = new MainFrame();
	   }
	   return mainFrame;
	 }
	 
	public synchronized JMenuBarCookBookMenu getMenuBarInstance(){
	   if(menuBar == null && menuBarCount == 0){
		 menuBarCount = 1;
		 menuBar = new JMenuBarCookBookMenu();
	   }
	   return menuBar;
	}
	
	public synchronized JDialogCreateRecipe1of4 getCreateRecipe1of4Instance(){
		if(createRecipe1 == null && createRecipe1Count == 0){
		 createRecipe1Count = 1;
		 createRecipe1 = new JDialogCreateRecipe1of4();
		}
		return createRecipe1;
	}
	
	public synchronized JDialogCreateRecipe2of4 getCreateRecipe2of4Instance(){
		if(createRecipe2 == null && createRecipe2Count == 0){
		 createRecipe2Count = 1;
		 createRecipe2 = new JDialogCreateRecipe2of4();
		}
		return createRecipe2;
	}
	
	public synchronized JDialogCreateRecipe3of4 getCreateRecipe3of4Instance(){
			if(createRecipe3 == null && createRecipe3Count == 0){
			 createRecipe3Count = 1;
			 createRecipe3 = new JDialogCreateRecipe3of4();
			}
			return createRecipe3;
		}
	
	public synchronized JDialogCreateRecipe4of4 getCreateRecipe4of4Instance(){
		if(createRecipe4 == null && createRecipe4Count == 0){
		 createRecipe4Count = 1;
		 createRecipe4 = new JDialogCreateRecipe4of4();
		}
		return createRecipe4;
	}

}
Da kannst Du Dir ja rausziehen wie ich meine View-Klassen verwalte bzw. was passiert wenn ich versuche über InstanceRegistryView darauf zuzugreifen

Bis dann 🙂
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben