Also ich versuche mal, das Problem mit Code-Schnipseln konkret zu machen. Vielleicht erkennt jemand, weshalb die grafische Darstellung nicht richtig funktioniert.
Zugegeben, es ist ein wenig viel, daher vielen Dank, wenn sich jemand die Mühe macht und sich da durchkämpft!
public class ProtocolDB
{
public static void main (String []args)
{
new Controller();
Controller.getController().createMainWindow();
}
}
public class Controller
implements ActionListener, KeyListener, ItemListener
/**
* Die Klasse Controller kommuniziert zwischen GUI und Factory.
* Alle Events, die z.B. durch Buttons ausgelöst
* werden, werden hier verarbeitet. Dafür ist das Interface ActionListener
* implementiert und ein statisches Objekt dieser Klasse als Listener für
* die jeweiligen Buttons auf den verschiedenen Panels gesetzt.
*
*/
{
private static Controller con;
MainWindow mainWindow;
Factory fac = new Factory();
JPanel mainPanel;
JPanel newGroupPanel;
JPanel groupViewPanel;
JPanel newPersonPanel;
JPanel personViewPanel;
JPanel newProtocolPanel;
public static Controller getController()
{
return con;
}
public Controller()
{
con = this;
}
/**
* Methode createMainwindow()
* Diese Methode wird unmittelbar nach dem Erzeugen eines Controller
* Objekts beim Programmstart ausgeführt. Sie erstellt zunächst das
* Hauptfenster und fügt das mainPanel hinein.
*/
public void createMainWindow()
{
mainWindow = new MainWindow();
AppQuitter quit = new AppQuitter (); //für Window-Events, hier nicht wichtig
mainWindow.addWindowListener( quit );
mainWindow.setVisible( true );
mainWindow.validate();
mainPanel = fac.createMainPanel();
activateMainPanel();
mainWindow.repaint();
}
/*
* activate-Methoden
* -=================-
*
*/
/**
*
* Methode activateMainPanel()
* Das Panel mainPanel wird nach dem ersten Erzeugen in einer
* Instanzvariable gespeichert und bei jedem Aufruf von activateMainPanel()
* aufgerufen. Damit wird vermieden, dass zu Lasten der Performance bei
* jedem Wechsel in das Hauptmenü ein neues Panel erzeugt werden muss.
*
* Dieses Prinzip greift auch bei allen folgenden activate(...) Methoden.
*
*/
private void activateMainPanel()
{
mainWindow.getContentPane().removeAll();
mainWindow.repaint();
mainWindow.getContentPane().add( mainPanel );
}
/**
*
* Methode activateNewGroupPanel
* Hier wird zunächst geprüft, ob die Instanzvariable bereits auf ein
* vorhandenes Panel verweist. Ist dies nicht der Fall, ruft ein Objekt
* vom Typ Factory die entsprechende Methode auf und speichert das neu
* angelegte Panel in einer Instanzvariable. Die ContentPane vom #
* Hauptfenster wird vollständig geleert, bevor das Panel hinzugefügt wird
*
*/
private void activateNewGroupPanel()
{
if( newGroupPanel == null )
{
newGroupPanel = fac.createNewGroupPanel();
System.out.println( "moin" );
}
mainWindow.getContentPane().removeAll();
mainWindow.repaint();
mainWindow.getContentPane().add( newGroupPanel );
}
//...
public void actionPerformed(ActionEvent evt)
{
/*
* Öffnen/Schließen-Events für Buttons
* -----===================================-----
*
*/
if( evt.getActionCommand().equals( "newGroupPanel.open" )) {activateNewGroupPanel();}
if( evt.getActionCommand().equals( "newGroupPanel.close" )) {activateMainPanel();}
}
}
Hier der relevante Ausschnitt der Factory-Klasse
public class Factory
{
public Factory ()
{
}
public MainPanel createMainPanel()
{
MainPanel mainPanel = new MainPanel();
return mainPanel;
}
public NewGroupPanel createNewGroupPanel()
{
NewGroupPanel newGroupPanel = new NewGroupPanel ();
return newGroupPanel;
}
}
Folgende Klasse beschreibt einen leeren JFrame.
public class MainWindow
extends JFrame
{
public MainWindow()
{
super ("Hauptmenü");
setLocation (750,70);
setSize (1000,1000);
setLayout(null);
setJMenuBar (new MainMenuBar());//hier auch unwichtig
}
}
public class MainPanel
extends JPanel
implements ActionListener, KeyListener
{
Factory fac = new Factory ();
Color c1 = new Color (250, 250, 240);
Color c2 = new Color (200, 200, 190);
Color c3 = new Color (150, 150, 140);
public MainPanel()
{
setSize(1000,1000);
setLayout (null);
setBackground(c1);
addComponents();
repaint();
}
public void addComponents()
{
//aus Platzgründen hier nur der relevante Button
JButton newGroup = new JButton ("Neue Gruppe");
newGroup.setBounds(20,15,170,40);
newGroup.setMargin(new Insets(1,1,1,1));
newGroup.setToolTipText("Eine neue Gruppe anlegen");
newGroup.setActionCommand("newGroupPanel.open");
newGroup.addActionListener (Controller.getController());
add(newGroup);
}
}
Jetzt zum Problempunkt:
class NewGroupPanel
extends JPanel
implements ActionListener, KeyListener
{
public NewGroupPanel()
{
super ();
setSize( 1000,1000 );
setLayout( null );
Color c1 = new Color( 250, 250, 240 );
setBackground( c1 );
setLayout( null );
addComponents();
repaint();
}
public void addComponents()
{
Color c2 = new Color( 200, 200, 190 );
Color c3 = new Color( 150, 150, 140 );
JPanel figure1 = new JPanel();
figure1.setBounds( 90,70, 320, 40 );
add( figure1 );
JPanel figure2 = new JPanel();
figure2.setBounds( 85,65,320,40 );
figure2.setBackground( c2 );
add( figure2 );
JPanel figure3 = new JPanel();
figure3.setBounds( 95,75,320,40 );
figure3.setBackground( c3 );
add( figure3 );
JLabel headline = new JLabel();
headline.setText( "Neue Gruppe erstellen" );
Font f1 = new Font( "Arial", Font.BOLD, 20 );
headline.setFont( f1 );
figure1.add( headline );
}
}
Das JLabel headline wird beim Aufruf des JPanels newGroupPanel nicht angezeigt. Wenn ich die Fenstergröße ändere, hingegen schon. An repaint()-Anweisung sollte es nicht mangeln.