CardLayout wechselt nicht die Panels

Iroque

Grünschnabel
Hallo!
Ich hab folgendes Problem:
Ich habe zwei Panels zwischen denen ich hin und her schalten möchte. Dafür nutze ich das CardLayout. Da der Quelltext sehr lang ist möchte ich die einzelnen Panels in eigene Klassen schreiben. Ich habe erstmal zum üben alles in einer Klasse geschrieben -hat alles funktioniert :) und dann wollte ich das auf mehrere Klassen aufteilen doch jetzt zeigt er nach dem Klick auf den Button nicht mehr das zweite Panel an :(
Ich hab hier mal beide versionen:
Alles in einer Klasse:
Code:
package angebotPresentationLayer;

import java.awt.*;
import javax.swing.*;

public class test extends JFrame implements ActionListener{
       JButton fortbt;
       JButton zurbt;
       CardLayout cardLayout;
       JPanel jpMain;
	
       public test(){
               zurbt = new JButton("zurück");
               fortbt = new JButton("fortfahren");
               zurbt.addActionListener(this);
               fortbt.addActionListener(this);
    	
               cardLayout = new CardLayout();
               Container cp = getContentPane();
               cp.setLayout(new BorderLayout());
                
               JPanel jpMenue = new JPanel();
               JPanel jpEdit = new JPanel();
                jpMain = new JPanel();
        
               cp.add(jpMain, BorderLayout.CENTER);
   
               jpMenue.setLayout(new GridBagLayout());
               jpEdit.setLayout(new GridBagLayout());
               jpMain.setLayout(cardLayout);
        
               jpMain.add(jpMenue, "1");
               jpMain.add(jpEdit, "2");  
        
               jpMenue.add(fortbt,
                     new GridBagConstraints(
                     0, 0, 1, 1, 0.0, 0.0,
                     GridBagConstraints.WEST, GridBagConstraints.NONE,
                     new Insets(0, 0, 0, 0),
                     0, 0));
               jpEdit.add(zurbt,
                     new GridBagConstraints(
                     0, 0, 1, 1, 0.0, 0.0,
                     GridBagConstraints.WEST, GridBagConstraints.NONE,
                     new Insets(0, 0, 0, 0),
                     0, 0));
              }

             public void actionPerformed(ActionEvent ae){
	     if (ae.getSource().equals(fortbt)){
	           System.out.println("Button wurde geklickt");
	           cardLayout.show(jpMain, "2");
                     }
	     if (ae.getSource().equals(zurbt)){
	           System.out.println("Button wurde geklickt");
	           cardLayout.show(jpMain, "1");
	     }
		
             }
	
             public static void main(String[] args){
                     test t = new test();
                     t.setSize(500, 500);
                     t.setVisible(true);
             }
}




Und hier jetzt mit den drei Klassen:
Klasse TestMain: (Ausgabe und Panel in das die anderen Panels als Karten kommen)
Code:
package angebotPresentationLayer; 

import java.awt.*; 

import javax.swing.*; 

public class TestMain extends JFrame{ 
	
    CardLayout cardLayout; 
    JPanel jpMain; 
    
    TestMenue tmenue = new TestMenue();
    TestEdit tedit = new TestEdit();
    
    TestMain(){
        cardLayout = new CardLayout(); 
        Container cp = getContentPane(); 
        cp.setLayout(new BorderLayout()); 

        jpMain = new JPanel(); 
        
        cp.add(jpMain, BorderLayout.CENTER); 

        jpMain.setLayout(cardLayout);
        
        jpMain.add(tmenue.jpMenue, "Menue"); 
        jpMain.add(tedit.jpEdit, "Edit");  
    } 

    public static void main(String[] args){ 
        TestMain tm = new TestMain(); 
        tm.setSize(500, 500); 
        tm.setVisible(true); 
    } 
}



Die KlasseMenue: (Panel das als erstes gezeigt werden soll)
Code:
package angebotPresentationLayer; 

import java.awt.*; 

import javax.swing.*; 


public class TestMenue extends JFrame{ 
   JPanel jpMenue; 
   
   JButton fortbt; 
    
   TestMenue(){ 
       fortbt = new JButton("fortfahren"); 
        
       TestListener tlis = new TestListener(this); 
       fortbt.addActionListener(tlis); 
        
       jpMenue = new JPanel(); 
       jpMenue.setLayout(new GridBagLayout()); 

       jpMenue.add(fortbt, 
            new GridBagConstraints( 
            0, 5, 1, 1, 0.0, 0.0, 
            GridBagConstraints.WEST, GridBagConstraints.NONE, 
            new Insets(0, 8, 0, 0), 
            0, 0)); 
      } 
}



Klasse TestEdit: (zweites Panel, was angezeigt werden soll)
Code:
package angebotPresentationLayer; 

import java.awt.*; 

import javax.swing.*; 


class TestEdit extends JFrame{ 
   JPanel jpEdit; 
   
   JLabel titellbl; 
    
   TestEdit(){ 
          titellbl = new JLabel("Titel des JPanels");
	   
         jpEdit = new JPanel(); 
    
         jpEdit.setLayout(new GridBagLayout()); 
      
         jpEdit.add(titellbl, 
      	   new GridBagConstraints( 
                   0, 0, 1, 1, 0.0, 0.0, 
                   GridBagConstraints.WEST, GridBagConstraints.NONE, 
                   new Insets(0, 0, 0, 0), 
                   0, 0)); 
         } 
}

Klasse TestListener: (ActionListener)
Code:
package angebotPresentationLayer; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

import javax.swing.*; 

public class TestListener implements ActionListener{ 
    TestMenue tmenue; 
    TestMain tmain; 
    
    TestListener(TestMenue tm){ 
           tmenue = tm; 
    }    
    
    public void actionPerformed(ActionEvent ae) {  
       if (ae.getSource().equals(tmenue.fortbt)){ 
           System.out.println("Button wurde geklickt"); 
           tmain = new TestMain();
           tmain.cardLayout.show(tmain.jpMain, "Edit");
       }
    }
}
Ich weiß, es ist echt viel Code aber ich hänge da nun schon ziemlich lange dran fest und bin voll verzweifelt...... also danke, an alle, die mir helfen!!
 
Hallo,

ich würde sagen, der Fehler liegt hier :

Code:
  public void actionPerformed(ActionEvent ae) {  
       if (ae.getSource().equals(tmenue.fortbt)){ 
           System.out.println("Button wurde geklickt"); 
           tmain = new TestMain();
           tmain.cardLayout.show(tmain.jpMain, "Edit");
       }
    }

Diese TestMain()-Objekt welches Du dort instanziierst, hat nichts mit deinem
sichtbaren TestMain() zu tun.
Kannst dir ja mal den Spass machen ein tmain.setVisible(true) einzufügen
dann siehst du gleich was ich meine !

Gruß JAdix
 
Hi!
Oh, das stimmt^^ da öffnet sich ja immer wieder ein neues Frame...
kannst du mir noch bitte sagen, wie ich es schreiben müßte, damit ich das JPanel bei dem sichtbaren Frame ändern kann?
Auf jeden Fall schonmal Danke
Gruß, Kai
 
Hallo,

wenn du möglichst wenig an deinem Code ändern willst mach es so :

Der Konstruktor von TestMenue bekommt einen Parameter -

TestMenue(TestMain main)

und ebdenso der TestListener -

TestListener(TestMain main)

wo du die Referenz auf dein TestMain-Objekt in deinem Instanzfeld speicherst.

Dann brauchst du die Referenz quasi nur durchreichen und kannst sie in
deinem Listener verwenden.

Nicht schön, aber einfach und in vielen Fällen auch OK es so zu lösen !

Gruß JAdix
 
Hi! erst nochmal Danke für deine Hilfe -aber ich kriegs irgendwie immer noch nicht hin...:( wäre es vllt möglich, dass du mir mal überall zeigst, wo ich was wie verädern müßte?:rolleyes:
Gruß
 
Hallo,

dann machs mal so ->

in TestMain :

Code:
 ...

   TestMenue tmenue = null;
   TestEdit tedit = null;
    
    TestMain(){
        
        cardLayout = new CardLayout();

        tmenue = new TestMenue(this);
        tedit = new TestEdit();
 
        ...

in TestMenue :

Code:
 ...

  TestMenue(TestMaint tm){ 

       fortbt = new JButton("fortfahren"); 
        
       TestListener tlis = new TestListener(tm, this); 
       fortbt.addActionListener(tlis); 

  ...

und in TestListener :

Code:
  ...

   TestMenue tmenue; 
   TestMain tmain; 
    
    TestListener(TestMain tma, TestMenue tme){ 
          tmain = tma;
          tmenue = tme; 
    }
    
    public void actionPerformed(ActionEvent ae) {  
       if (ae.getSource().equals(tmenue.fortbt)){ 
           System.out.println("Button wurde geklickt"); 

           tmain.cardLayout.show(tmain.jpMain, "Edit");
       }
    }
    ...

Alles klar ?

Gruß JAdix
 
Schön,

so soll es sein !

Wenn dennoch Fragen auftauchen sollten, einfach nochmal posten !

Gruß JAdix und happy coding !

PS : für ne nette Bewertung bin ich immer zu haben ! :)
 
Zurück