# Panels wechseln auf Knopfdruck



## Britta_90 (12. Mai 2011)

Hallo Leute!

Ich bin verzweifelt und weiß nicht weiter! Ich habe zwei Panels mit NetBeans erstellt und möchte gerne, dass wenn man einen Knopf im ersten Panel drückt, das zweite erscheint.

Ausschnitte aus meinem Code:

[Java]
public class Frame extends JFrame {

    Dimension dim = new Dimension(1024, 768);
    Panel1 panel1;
    Panel2 panel2;    
    Container[] panel;

[/Java]

[Java]
    private void createArray(){
        panel = new Container[2];
        panel[0] = panel1;
        panel[1] = panel2;
    }
[/Java]

[Java]
    private void setPane(int i){
        setContentPane(panel[i-1]);
        panel[i-1].setSize(dim);
    }
[/Java]

[Java]
    public static void main(String args[]) throws InterruptedException {
            Frame frame = new Frame();
            frame.setVisible(true);                     
            frame.setPane(1);

            //Was muss ich hier machen?

            frame.setPane(2);            
        };
[/Java]

In der Klasse Panel1:

[Java]
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            //Was muss ich hier machen?        
    }  
[/Java]

So, meine Frage: Ich weiß, dass ich irgendetwas mit wait() und notify() machen muss, aber ich weiß nicht weiter . Kann mir jemand helfen?

Und noch eine Frage: Ich habe ja ein Array angelegt, in welchem zwei Objekte die durch unterschiedliche Klassen generiert wurden, erstellt. Dazu folgendes Problem:

Ich habe in den Klassen "Panel1" und "Panel2" jeweils das Attribut "int XXX". Nun kann ich jedoch leider nicht per "panel[1].XXX" auf dieses Attribut zugreifen und es dynamisch machen, wenn ich z.B. von Panel1 und Panel2 mit einer Schleife diese beiden Attribute addieren will. Wie kann ich das denn realisieren?

Grüße,

Eure Britta!


----------



## Michael... (12. Mai 2011)

Britta_90 hat gesagt.:


> Ich bin verzweifelt und weiß nicht weiter! Ich habe zwei Panels mit NetBeans erstellt und möchte gerne, dass wenn man einen Knopf im ersten Panel drückt, das zweite erscheint.


Verwende CardLayout, dieser LayoutManager ist dafür gedacht, dass man während der "Laufzeit" problemlos zwischen Komponenten wechseln kann.


Britta_90 hat gesagt.:


> So, meine Frage: Ich weiß, dass ich irgendetwas mit wait() und notify() machen muss


Woher? Hilft Dir in dem Fall nicht weiter.


Britta_90 hat gesagt.:


> Und noch eine Frage: Ich habe ja ein Array angelegt, in welchem zwei Objekte die durch unterschiedliche Klassen generiert wurden, erstellt. Dazu folgendes Problem:
> 
> Ich habe in den Klassen "Panel1" und "Panel2" jeweils das Attribut "int XXX". Nun kann ich jedoch leider nicht per "panel[1].XXX" auf dieses Attribut zugreifen und es dynamisch machen, wenn ich z.B. von Panel1 und Panel2 mit einer Schleife diese beiden Attribute addieren will. Wie kann ich das denn realisieren?


Verstehe es nicht zu 100%: Lösungsansätze Methoden (getter und setter) Ausserdem sollte das Array vom Typ der Klassen sein, d.h. eventuell ein Interface verwenden.


----------



## Britta_90 (12. Mai 2011)

Michael... hat gesagt.:


> Woher? Hilft Dir in dem Fall nicht weiter.



Was muss ich denn dann machen, dass wenn der Knopf gedrückt wird sich die Panels wechseln?



Michael... hat gesagt.:


> Verstehe es nicht zu 100%: Lösungsansätze Methoden (getter und setter) Ausserdem sollte das Array vom Typ der Klassen sein, d.h. eventuell ein Interface verwenden.



Wenn ich folgendes mache:

[Java]

panel[1] = panel1;

[/Java]

Und nun darauf eine Methode anwenden will, so funktioniert panel1.methode() perfekt, jedoch panel[1].methode() eben nicht. Was kann ich gegen dieses Problem machen?


----------



## jgh (12. Mai 2011)

einfach casten:


```
((Panel1)panel[1]).methode();
```


----------



## Britta_90 (12. Mai 2011)

jgh hat gesagt.:


> einfach casten:
> 
> 
> ```
> ...



Das ist lieb gemeint, aber bringt mich leider nicht viel weiter. Würde das ganze gerne dynamisch gestalten, hier habe ich ja wieder das "Panel1" drin. Möchte gerne (später) so etwas gestalten wie

[Java]
int total = 0;

for (int i = 1; i < 10; i++){
    total = panel_.getXXX() + total;
}
[/Java]

Was aber ja leider so nicht geht._


----------



## Britta_90 (12. Mai 2011)

Britta_90 hat gesagt.:


> Das ist lieb gemeint, aber bringt mich leider nicht viel weiter. Würde das ganze gerne dynamisch gestalten, hier habe ich ja wieder das "Panel1" drin. Möchte gerne (später) so etwas gestalten wie
> 
> [Java]
> int total = 0;
> ...


_

Ok, habe es mit Hilfe eines Interfaces selbst hinbekommen, danke Michael... für den Tipp .

Nur wie mache ich, dass sich das Panel wechselt, sobald ich im ersten Panel einen Knopf drücke?_


----------



## Volvagia (12. Mai 2011)

?


```
import java.awt.CardLayout;
import java.awt.Color;
import java.util.concurrent.TimeUnit;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Card
{
	public static void main(String[] args)
	{
		final JFrame frame = new JFrame();
		final CardLayout layout = new CardLayout();
		frame.setLayout(layout);
		frame.setSize(200, 200);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JPanel panelA = new JPanel();
		panelA.setBackground(Color.RED);
		frame.add(panelA, "A");
		
		JPanel panelB = new JPanel();
		panelB.setBackground(Color.BLUE);
		frame.add(panelB, "B");
		
		new Thread() {
			public void run() {
				try
				{
					TimeUnit.SECONDS.sleep(3L);
				}
				catch (InterruptedException e) {}
				
				layout.show(frame.getContentPane(), "B");
			};
		}.start();
		
		frame.setVisible(true);
	}
}
```


----------



## L-ectron-X (12. Mai 2011)

Vielleicht noch ein Tipp, der jede Menge Ärger ersparen könnte:
Sachen wie
[Java]
public class Frame extends JFrame
[/Java]
und daraus folgend

```
Frame frame = new Frame();
[/Java]
können dir Ärger machen und zu unerwünschen Ergebnissen führen.

Du solltest vermeiden, Klassen so zu benennen, wie die aus der Java-API.
Frame ist eine Klasse aus java.awt. Es genügt eine falsche Import-Anweisung und schon wunderst du dich, warum nichts mehr geht.
```


----------



## Gast2 (13. Mai 2011)

Volvagia hat gesagt.:


> ?
> 
> 
> ```
> ...



Sowas solltest du auch vermeiden, die GUI MUSS im EDT bearbeitet werden!


----------



## Volvagia (13. Mai 2011)

Stimmt, ich wollte den Code bloß nicht zu verkomplizieren, sie will es eh im Listener (=EDT) machen. ^^


----------



## Britta_90 (13. Mai 2011)

Volvagia hat gesagt.:


> Stimmt, ich wollte den Code bloß nicht zu verkomplizieren, sie will es eh im Listener (=EDT) machen. ^^



Wie genau muss ich da vorgehen? Ich habe leider überhaupt keine Ahnung 

Also ich habe bisher das hier in einer meiner Panel Klassen:

[Java]
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         

    }
[/Java]

Nur wie muss ich das bei Volvagias Code (welches meine Frame Klasse ist) statt der "sleep" Methode einbringen?


----------



## Volvagia (13. Mai 2011)

Das Sleep kannst du weglassen, war nur damit nicht sofort umgeschalten wird.


----------



## Britta_90 (13. Mai 2011)

Volvagia hat gesagt.:


> Das Sleep kannst du weglassen, war nur damit nicht sofort umgeschalten wird.



Das habe ich nicht gemeint. Ich möchte erst gerne umschalten, wenn ein Knopf von meinem Panel1 gedrückt wird.

Habe es derzeit so

In meiner Frame Klasse:

[Java]
           //Vor dem Umschalten

            while(frame.panel1.wait == false){
                Thread.sleep(300);
             }

          //Nach dem Umschalten
[/Java]

In der Klasse Panel1:

[Java]
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        wait = true;
    }
[/Java]

Es tut, aber sicher geht es doch elleganter?


----------



## Volvagia (13. Mai 2011)

Warum schaltest du nicht direkt im ActionListener um?


----------



## Gast2 (13. Mai 2011)

Solltest dir erstmal die Grundlagen druchlesen

1. How to Write an Action Listener (The Java™ Tutorials > Creating a GUI With JFC/Swing > Writing Event Listeners)
2.How to Use CardLayout (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container)


----------



## Britta_90 (13. Mai 2011)

Volvagia hat gesagt.:


> Warum schaltest du nicht direkt im ActionListener um?



Das ist ja mein Problem, ich weiß leider nicht wie, habe voll das Brett vorm Kopf :-(


----------



## Volvagia (13. Mai 2011)

Hab dir doch ein Beispiel gepostet.
Mit CardLayout#show(Parent, Name) switcht du zwischen den Komponenten herum.


----------



## Britta_90 (13. Mai 2011)

Volvagia hat gesagt.:


> Hab dir doch ein Beispiel gepostet.
> Mit CardLayout#show(Parent, Name) switcht du zwischen den Komponenten herum.



Ok vielen Dank, habe es hinbekommen . Manchmal sieht man den ganzen Wald vor lauter Bäumen nicht mehr .


----------

