# JPanels in JFrame einfügen



## javama (5. Mai 2011)

hallo,
ich habe ein JFrame (Hauptfenster), in diese hauptfenster sollen JPanels eingefügt werden, 
wenn ich das programm ausführe, bekomme ich das Hauptfenster mit den AuswahlPanel mit 4 Buttons (gridlayout),  jeder Button ist für ein Panel verantwortlich, dass heisst wenn ich ein Button1 anklicke wird Panel1 angezeigt innerhalb von meiner Frame.

ich habe auch ein  ButtonZurück (borderlayout.South) um zu dem Hauptauswahl zurückzukehren.

Mein problem jetzt wenn ich das Programm ausführe und Button1 klicke, bekomme ich 
panel1, und wenn ich zum Hauptauswahl anhand buttonZurück zurückkehre und dann Button2 anklicke bekomme ich wieder Panel1.

wenn ich die anwendung schliesse und wieder ausführe, jetzt wenn ich Button2 klicke, bekomme ich panel2, und wenn ich zum Hauptauswahl anhand buttonZurück zurückkehre und dann Button1 anklicke bekomme ich wieder Panel2.

hat jemand eine Idee woran das liegen kann****?
danke im voraus


----------



## MiMi (5. Mai 2011)

Meine Kristallkugel sagt mir... oehm.. nix..
Bisschen Code (in java-Tags) waere hilfreich


----------



## javama (5. Mai 2011)

jkndenjdndn dn


----------



## MiMi (5. Mai 2011)

Hm die haelfte von meinem Post einfach ueberlesen oder nicht verstanden?
Nochmal, BITTE in java-tags (siehe meine Signatur)


----------



## SE (5. Mai 2011)

Also ... nach dem ich mir den Code nun mit Notepad2 erstmal ordentlich formatiert und Syntax-Highlighting aktiviert habe bin ich mal so über den Code geflogen.

1) KEIN Compile-bares Beispiel ... wir können leider nicht testen was da kaputt ist wenn du uns nicht den gesamten Source postest ... oder zumindest so viel das man das ganze auch compilen kann ...
2) Deine public void arbeitsfaecheBereinigen hat sowas von wenig Sinn. Warum gehst du mit einer for-Schleife alle Elemente durch wenn du eh Container.removeAll() aufrufst ? ... Das kannst du auch ohne die for-Schleife.
3) Eine MenuBar braucht man nicht mit einem BorderLayout an den oberen Rand kleben ... dafür gibt es die Methode java.awt.Frame.setMenuBar(MenuBar) bzw javax.swing.JFrame.setJMenuBar(JMenuBar)
4) Der vermeintliche Fehler ist das du arbeitsfleache.setVisible(false) aufrufst und danach aber etwas zum Container addest ... wenn du nun zurück gehst setzt du die alte arbeitsflaeche wieder auf true und addest aber nun noch eine weitere. Du solltest hier also wirklich erstmal den Container mit removeAll() aufräumen
5) Verwende beim nächsten Post bitte [code=java]CODE[/code]-codetags und poste bitte den GESAMTEN RELEVANTEN Source damit man es auch mal zum test Compilen kann.


----------



## HonniCilest (5. Mai 2011)

Du fügst zwar die Panels immer schön hinzu, aber wo entfernst du die vorherigen wieder?

Es gibt jedoch auch Möglichkeiten die Panels in verschiedenen Ebenen anzuordnen und diese je nach dem in den Vordergrund bzw in den Hintergrund zu rücken. Schau dir z.B. mal die JLayeredPane an...


----------



## MiMi (5. Mai 2011)

SPiKEe hat gesagt.:


> 5) Verwende beim nächsten Post bitte [code=java]CODE[/code]-codetags und poste bitte den GESAMTEN RELEVANTEN Source damit man es auch mal zum test Compilen kann.


 
Ohne code-tags sollte man sich den Code gar nicht anschauen, so lernen es die Leute nie, aber wenn ihr euch das antun wollt bitte ^^
Der relevante Code ist eigentlich nur der des hinzufuegens/entfernen und wechseln der Panel, falls dieser nicht ausreicht, kann man immer noch mehr posten lassen, bevor nachher 20k Zeilen Code hier stheen


----------



## SE (5. Mai 2011)

@HonniCilest
JLayeredPane ist zwar eine sehr resourcensparende Variante ... allerdings zu kompliziert da alle MouseEvents die nicht auf ein Objekt gehen das MouseListener implementiert so lange zum nächsten darunterliegenden Objekts durchgereicht werden bis es auf eine Component trifft die MouseListener implementiert ... also im Falle des Beispieles würde dann ein MouseEvent an das JPanel mit den JButtons weitergereicht wenn nicht jedes JPanel extra MouseListener implementiert und damit das weiterreichen blockiert. Von daher für TO eine eher schlechte wahl.

@MiMi
Das die relevanten Zeilen nur das Hinzufügen und das fehlende Entfernen der JPanels ist ist mir auch klar. Und Source der nicht in Codetags steht gucke ich mir in der Regel auch nicht an, aber ich wollte TO darauf hinweisen das wenn er schon Code postet dieser auch compile-bar sein sollte ... Das es sich bei uns gehört Source in die entsprechenden Codetags zu posten weiß ich doch auch ... es war aber nicht die Kernaussage meines Posts.


----------



## javama (5. Mai 2011)

ich habe gen gesamten Code eingefügt


----------



## HonniCilest (5. Mai 2011)

Wenn ich das jetzt richtig verstehe, willst du mir sagen, dass die Buttons auch aktiviert werden würden, wenn der entsprechende Layer nicht im Vordergrund ist? Das wusste ich nicht, wenn du wirklich so ist will ich nix gesagt haben


----------



## javama (5. Mai 2011)

HonniCilest hat gesagt.:


> Wenn ich das jetzt richtig verstehe, willst du mir sagen, dass die Buttons auch aktiviert werden würden, wenn der entsprechende Layer nicht im Vordergrund ist? Das wusste ich nicht, wenn du wirklich so ist will ich nix gesagt haben


 
erstens die mein Main Meehode

```
public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Hauptfenster hauptfenster = Hauptfenster.getHauptfenster();
		hauptfenster.setVisible(true);
		

	}

}
```

wenn das programm gestartet wird sind die Buttons aktiviert, das problem ist wenn man  button1 klickt bekommt man panel1 (ich bin button1), wenn man zur hauptauswahl zurückkehrt und button2 klickt bekommt man panel1 (ich bin button1)
ich gleube es geht um Remove******
hat jemand eine Idee****


----------



## MiMi (5. Mai 2011)

Lies auch die Antworten die du bekommst. 
Siehe mal die Antwort von Spike (4)


----------



## SE (5. Mai 2011)

@TO
HonniCilest meinte MICH mit dem JLayeredPane ... das war eigentlich kein Post für dich ... daher versteh ich dein Quote auch nicht.
Und JA ... es liegt am FEHLENDEN remove ... wie ich oben bereits geschrieben habe ... bitte mal diese 5 Punkte umsetzen.
Außerdem kann man deine import-Anweisungen kürzen.

```
import java.awt.*;
import javax.swing.*;
import java.util.*;
```
reicht voll und ganz aus.
BTW : Satzzeichen sind keine Rudeltieren. Einfach reicht. *Und jetzt flame bitte nicht wegen meinen drei Punkten. Diese sind eigentlich als Auslassungszeichen gedacht, werden aber auch als Pausen interpretiert.*

@HonniCilest
Jop. Mach mal 2 JPanels und adde die einem JLayeredPane. Dem unteren fügst du einen JButton hinzu *am besten über BorderLayout.CENTER damit er das gesamte JPanel ausfüllt*. Dem oberen JPanel addest du garnichts. Jetzt starte das ganze mal ... du wirst sehen das der JButton reagiert. Wenn du das obere JPanel opaque machst dann siehst du sogar das sogar die Animation gezeichnet wird.
Adde dann mal dem oberen JPanel einfach ein MouseListener und fange alle Events ab *am besten dann einfach System.out.println()*. Dann reagiert der untere JButton nicht mehr da alle MouseEvents vom oberen JPanel aufgefangen werden.
Es steht auch in der Doc von MouseEvent das es an das erste Object durchgericht wird dessen Bounds die x und y Koordinaten umschlißen. Wobei das "ERSTE" dadurch "errechnet" wird welches am weitesten oben ist ... also das TOP-Object. Und wenn halt das TOP-Object trotzdem noch überzeichnet ist ... aber das drüberliegende Object keine MouseEvents fängt wird es bei der Ermittlung ignoriert.


----------



## javama (5. Mai 2011)

irgendwas stimmt nicht mit remove
habe ich versucht aber geht nicht!


----------



## SE (5. Mai 2011)

Um dir die lösung zu geben ...

```
public void zeigeHauptauswahlGui()
{
arbeitsflaeche.removeAll();
//rest
}
```
War das WIRKLICH so schwer ?


----------



## javama (5. Mai 2011)

das funktioniert nicht 

```
public void zeigeHauptauswahlGui()
{
arbeitsflaeche.removeAll();
//rest
}
```
wenn man button1 anklickt bekommt man panel1 (ich bin button 1), wenn man zum hauptauswahl zurückkehrt und button2 anklickt bekommt man WIEDER panel1 (ich bin button 1), ABER bei button2 muss (ich bin button 2) angezeigt werden.
ES GEHT JETZT DARUM; DASS ES BEI JEDEM BUTTON DIE JEWEILIGE PANEL ANGEZEIGT WIRD:


----------



## SE (5. Mai 2011)

Ok ... wie wäre es wenn du am besten einfach mal GANZ GENAU beschreibst was du erreichen willst und wir geben dir Hinweise für einen funktionieren Code. Das damit natürlich verbunden ist den ganzen Code über den Haufen zu werfen und noch mal neu anzufangen ist logisch, denn ich glaube keiner will sich die Mühe machen deinen ziemlich schlechten Code auseinander zu nehemen. Sorry für die Wortwahl aber anderst kann ich das da nicht mehr bezeichnen weil die Lösung eigentlich sehr einfach ist. Und NEIN ... hoffe nicht darauf das sich hier jemand n Herz fasst und dir n KOMPLETTEN Code hinpostet ... denn davon lernst du es nicht.


----------



## javama (5. Mai 2011)

die geschichte mit REMOVE habe ich gemcht bevor ich dieses problem veröffentlicht habe.
und hat nicht geklapt und jetzt meinen Sie dass das funktioniert!


----------



## javama (5. Mai 2011)

gdgfggsdfg


----------



## SE (5. Mai 2011)

SO kann das garnicht funktionieren ...
Ich hab jetzt echt die Schnauze voll .. ich schreib dir jetzt n funktionierendes Beispiel ...
Echt ... es kann nich wahr sein wie sich einigee echt anstellen ....


----------



## SE (5. Mai 2011)

So ... hier jetzt mal ein zwar sehr umständliches Beispiel ... aber es funktioniert und macht genau das was du hier die ganze Zeit versuchst und wir versuchen dir zu erklären.


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Test extends JFrame implements ActionListener
{
	private JButton backButton, exitButton, jButtonOne, jButtonTwo, jButtonThree, jButtonFour;
	private JMenuBar jMenuBar;
	private JMenu menu;
	private JMenuItem jMenuItem;
	private JPanel mainPanel, bottomPanel, buttonOnePanel, buttonTwoPanel, buttonThreePanel, buttonFourPanel;
	public static void main(String[] args) { (new Test()).start(); }
	private Test()
	{
		super("TEST");
		jMenuBar=new JMenuBar();
		menu=new JMenu("Hauptfenster");
		jMenuItem=new JMenuItem("EXIT");
		jMenuItem.addActionListener(this);
		jMenuItem.setActionCommand("exitButton");
		menu.add(jMenuItem);
		jMenuBar.add(menu);
		setJMenuBar(jMenuBar);
		setLocation(200, 200);
		setSize(300, 300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		backButton=new JButton("BACK");
		backButton.addActionListener(this);
		backButton.setActionCommand("backButton");
		backButton.setEnabled(false);
		exitButton=new JButton("EXIT");
		exitButton.addActionListener(this);
		exitButton.setActionCommand("exitButton");
		jButtonOne=new JButton("ONE");
		jButtonOne.addActionListener(this);
		jButtonOne.setActionCommand("jButtonOne");
		jButtonTwo=new JButton("TWO");
		jButtonTwo.addActionListener(this);
		jButtonTwo.setActionCommand("jButtonTwo");
		jButtonThree=new JButton("THREE");
		jButtonThree.addActionListener(this);
		jButtonThree.setActionCommand("jButtonThree");
		jButtonFour=new JButton("FOUR");
		jButtonFour.addActionListener(this);
		jButtonFour.setActionCommand("jButtonFour");
		mainPanel=new JPanel();
		mainPanel.setLayout(new GridLayout(2, 2, 10, 10));
		mainPanel.add(jButtonOne);
		mainPanel.add(jButtonTwo);
		mainPanel.add(jButtonThree);
		mainPanel.add(jButtonFour);
		setLayout(new BorderLayout());
		add(mainPanel, BorderLayout.CENTER);
		bottomPanel=new JPanel();
		bottomPanel.add(backButton);
		bottomPanel.add(exitButton);
		add(bottomPanel, BorderLayout.SOUTH);
		buttonOnePanel=new JPanel();
		buttonOnePanel.add(new JLabel("BUTTON ONE"));
		buttonTwoPanel=new JPanel();
		buttonTwoPanel.add(new JLabel("BUTTON TWO"));
		buttonThreePanel=new JPanel();
		buttonThreePanel.add(new JLabel("BUTTON THREE"));
		buttonFourPanel=new JPanel();
		buttonFourPanel.add(new JLabel("BUTTON FOUR"));
	}
	private void start() { setVisible(true); }
	public void actionPerformed(ActionEvent e)
	{
		String com=e.getActionCommand();
		if(com.equals("exitButton"))
			System.exit(0);
		if(com.equals("backButton")) { showMain(); return; }
		if(com.startsWith("jButton"))
		{
			if(com.endsWith("One")) { showOne(); return; }
			if(com.endsWith("Two")) { showTwo(); return; }
			if(com.endsWith("Three")) { showThree(); return; }
			if(com.endsWith("Four")) { showFour(); return; }
		}
	}
	private void showMain()
	{
		getContentPane().removeAll();
		add(mainPanel, BorderLayout.CENTER);
		add(bottomPanel, BorderLayout.SOUTH);
		backButton.setEnabled(false);
		getContentPane().validate();
		update(getGraphics());
	}
	private void showOne()
	{
		getContentPane().removeAll();
		add(buttonOnePanel, BorderLayout.CENTER);
		add(bottomPanel, BorderLayout.SOUTH);
		backButton.setEnabled(true);
		getContentPane().validate();
		update(getGraphics());
	}
	private void showTwo()
	{
		getContentPane().removeAll();
		add(buttonTwoPanel, BorderLayout.CENTER);
		add(bottomPanel, BorderLayout.SOUTH);
		backButton.setEnabled(true);
		getContentPane().validate();
		update(getGraphics());
	}
	private void showThree()
	{
		getContentPane().removeAll();
		add(buttonThreePanel, BorderLayout.CENTER);
		add(bottomPanel, BorderLayout.SOUTH);
		backButton.setEnabled(true);
		getContentPane().validate();
		update(getGraphics());
	}
	private void showFour()
	{
		getContentPane().removeAll();
		add(buttonFourPanel, BorderLayout.CENTER);
		add(bottomPanel, BorderLayout.SOUTH);
		backButton.setEnabled(true);
		getContentPane().validate();
		update(getGraphics());
	}
}
```

@Rest
Ja Leute ich weis ... der Code ist nicht der Beste ... aber er sollte nur aufzeigen wie einfach es ist das zu erreichen was TO wollte ...
Natürlich kann man sich den ganzen Duplicated-Code sparen ... aber ich glaube das würde TO dann wirklich nicht mehr verstehen.


EDIT 2 : Wenn du jetzt aus Gnatz deinen Code rausnimmst ... dann schreib bitte etwas SINNVOLLES. *sowas wie "GELÖSCHT" oder so*


----------



## thunderwave (6. Mai 2011)

Wieso nicht einfach eine TabbedPane ?


----------



## javama (6. Mai 2011)

Danke schön
jetzt funktioniert mein programm
ich wollte nur wissen was macht genau (validate) und (update) da hatte ich probleme****


----------



## MiMi (6. Mai 2011)

@javama 
Reiss dich bitte zusammen. In diesem Forum wird auf die Gross- und Kleinschreibung geachtet. 
Die Leute helfen dir hier aus freien Stuecken und 'opfern' dafuer ihre Freizeit. 
Tausende von * oder Saetze in Komplett Grossbuchstaben


> ES GEHT JETZT DARUM; DASS ES BEI JEDEM BUTTON DIE JEWEILIGE PANEL ANGEZEIGT WIRD:


 kannst du dir da bitte sparen. Grossschreiben wird als schreien interpretiert und du willst doch niemanden anschreien der dir helfen will?


----------



## javama (6. Mai 2011)

MiMi hat gesagt.:


> @javama
> . Grossschreiben wird als schreien interpretiert und du willst doch niemanden anschreien der dir helfen will?



Sorry. ich wollte hier niemanden anschreien, ich wollte nur drauf hinweisen wo genau mein problem ist.


----------



## SE (6. Mai 2011)

javama hat gesagt.:


> was macht genau validate() und update(Graphics)



Dazu klickst du einfach auf meine Signatur "Java 7 API" klickst dich über java.awt zu Component durch ... scrollst bei der Methoden-Liste ganz nach unten ... da hast du dann die Methoden Component.validate() und Component.update(Grphics).
Zur genaueren Erklärung klickst du dann einfach drauf.


----------

