# JFrame und repaint()/validate()



## Imwithstupid (18. Jan 2008)

Ein Hallo von mir hier an die Monitore zu Hause!

Also, ich muss vorweg schicken, das Problem ist durchaus bekannt und es gibt vielerlei Threads und Hilfen dazu im Internet. Aber überall lese ich nach, dass ich das Problem mit validate() lösen soll, was bei mir aber irgendwie nicht zu funktionieren scheint, daher dieser Thread. 

Mein System:
Windows XP SP2 mit aktuellen Updates
J2SE 6 Update 3
Eclipse 3.2.2

Mein Problem ist folgendes:

Ich hab eine Java-Swing-Anwendung, die das ein oder andere machen soll und mit der man über die Menüpunkte auf verschiedene JPanels kommen soll. Das funktioniert an sich auch alles wunderbar, aber leider kommen da Probleme mit dem Erneuern des Panels oder Frames, oder was immer dafür auch relevant ist, auf.

Aber ich zeige zunächst mal meinen Code (beziehungsweise Ausschnitte, die meiner Meinung relevant sind, um hinter die Funktionsweise zu gelangen) und erläutere dann noch weiteres.


```
package gui;

import java.awt.Container;

import javax.swing.JFrame;

import util.WindowClosingAdapter;

public class FrameGenerator extends JFrame {
	private static final long serialVersionUID = 1L;
	private static FrameGenerator mFrame;
	private Container mContentPane= getContentPane();
	
	public FrameGenerator () {
		super("Spielwiese");
		setFrame(this);
		addWindowListener(new WindowClosingAdapter(true));
		MenuBarGenerator menuBar = new MenuBarGenerator();
		menuBar.setMenus([...]);
		setJMenuBar(menuBar.getMenuBar());
	}
	
	public static FrameGenerator getFrame() {
		return mFrame;
	}
	
	private void setFrame(FrameGenerator frame) {
		mFrame = frame;
	}
	
	public Container getPane() {
		return mContentPane;
	}
	
	public static void repaintFrame() {
		mFrame.invalidate();
		mFrame.validate();
		mFrame.repaint();
		mFrame.pack();
	}

	public static final long getSerialVersionUID () {
		return serialVersionUID;
	}
	
}
```

Das ist meine Klasse für das JFrame. Im MenuBarGenerator werden die JMenuBar und die JMenus gesetzt und über einen Listener abgefangen.
Der WindowClosingAdapter ist eine einfache util-Klasse für den WindowListener.
repaintFrame() zeigt meine Verzweiflung in dem Thema refresh des Fensters, nachdem neue Informationen eingegangen sind und sah auch schon mal besser aus, also ohne so viele Funktionen, derzeit aber so, weil ich alles mögliche probiert habe, um den besch.....en Frame zu aktualisieren. 

Der Frame wird folgendermaßen aus anderen Klassen mit Informationen gefüttert:


```
FrameGenerator.getFrame().getPane().add(panel);
FrameGenerator.repaintFrame();
```

Das ist vielleicht nicht die feine englische Art, vielleicht liegt's ja auch daran. Das Panel wird vorher mit anderen Swing-Komponenten aufgefüllt, erhällt ein Layout und wird anschließend dem ContentPane zugefügt. Anschließend wird meine wirre repaintFrame()-Funktion ausgeführt.

Für das erste MenuItem-Event funktioniert das auch alles wunderbar, das Panel wird geladen und erscheint fehlerfrei im Frame. Wähle ich im Anschluss ein anderes MenuItem und wird dem entsprechend ein neues Panel generiert, welches danach an das ContentPane geschickt wird, so erkennt man noch die Teile des alten Panels als auch die Teile des neuen Panels. So erscheinen zum Beispiel die alten JButtons des alten Panels auch im neuen Panel, geht man mit der Maus über die Position, wo sich der alte Button befand.

Ich habe in einigen Lösungen etwas von revalidate() aus javax.swing.JComponent, wo ich mir aber über die Anwendung der Funktion nicht ganz im Klaren bin, also vielleicht ist das Problem ja recht einfach, aber ich bin mittlerweile irgendwie wirklich daran verzweifelt. 

Naja, vielleicht habt ihr ja irgendwelche hilfreichen Tipps für mich. Und bitte nicht zu komplizierte Erläuterungen, das ist meine erste Swing-Anwendung, deswegen übersehe ich vielleicht auch einfach nur irgendetwas, was eigentlich vollkommen typisch für Swing-Anwendungen sein sollte.

MfG

imwithstupid


----------



## Gast2 (18. Jan 2008)

wenn du auf dein contentPane ein neues JPanel adden willst solltest du das alte mit remove erst weglöschen...


----------



## Imwithstupid (18. Jan 2008)

Schande über mein Haupt.

Also, für alle, die selbiges Problem haben:
Ihr könnt meinen Code gerne haben, aber anstatt obigen Code aus Codebeispiel Nummer 2, nehmt einfach den hier und alles funktioniert:


```
FrameGenerator.getFrame().getPane().removeAll();
		FrameGenerator.getFrame().getPane().add(panel);
		FrameGenerator.repaintFrame();
```


Und dann auch noch danke an SirWayne, schnelle und umkomplizierte Hilfe.  Dankeschön


----------

