Panels wechseln auf Knopfdruck

  • Themenstarter Themenstarter Britta_90
  • Beginndatum Beginndatum
B

Britta_90

Gast
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!
 
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.
So, meine Frage: Ich weiß, dass ich irgendetwas mit wait() und notify() machen muss
Woher? Hilft Dir in dem Fall nicht weiter.
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.
 
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?

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?
 
einfach casten:

Java:
((Panel1)panel[1]).methode();
 
Zuletzt bearbeitet:
einfach casten:

Java:
((Panel1)panel[1]).methode();

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.
 
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.


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?
 
?

Java:
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);
	}
}
 
Vielleicht noch ein Tipp, der jede Menge Ärger ersparen könnte:
Sachen wie
[Java]
public class Frame extends JFrame
[/Java]
und daraus folgend
Java:
            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.
 
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?
 
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?
 

Zurück
Oben