# versch. JPanel Klassen über Menü öffnen



## plammy (25. Mai 2012)

hallo 

Ich habe folgendes Problem.. Ich habe 2 Menüs.. Datei(Neu, Öffnen...) und Werbemittel(A, B, C,....)
Wenn man auf Neu oder die Sachen in Datei drück ist kein Ding dann tuen die halt die Aktionen in den general JPanl dem ich in Main Window Aufrufe... Ich will aber dass wenn ich in menü Werbemittel auf A zB klicke dass sich meine Klasse mit dem entsprehenden Layout für Werbemittel A öffen und den bestehenden Layout weggeht.

Codeausschnitte:


```
public class MainWindow extends JFrame {

    public MainWindow() {      
        
        setJMenuBar(Menu.MenuBar());   
        setContentPane(Panel.initComponents());
       
        //setContentPane(A.initA());    
        
        pack();
        setTitle("Layout Tool");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {                 
                MainWindow ex = new MainWindow();
    
                ex.setVisible(true);
                
                
            }
        });
    }
}
```



```
public class Menu extends JPanel{
    
     protected static JMenu getMenuFile() {
 
        JMenu file_menu = new JMenu("Datei"); 
 // Untermenue "Neu" 
            JMenuItem file_menu_new = new JMenuItem("Neu");	
            
            file_menu_new.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent event){

........................

 
        file_menu.add(file_menu_new);
        file_menu.add(file_menu_open);
        file_menu.add(file_menu_save);
        file_menu.add(file_menu_save_under);
        file_menu.add(file_menu_print);
        file_menu.add(file_menu_exit);
   
        return file_menu;
    }
   
     
      protected static JMenu getMenuAdforms() {
           JMenu ads_menu = new JMenu("Werbemittel"); 		
        					

            // Untermenue "Werbemittel A" 
            JMenuItem ads_menu_suba = new JMenuItem("A");	
              ads_menu_suba.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                           Panel.initComponents().setVisible(false);     //!!!! HIER HACKT's
                           Panel.initComponents().removeAll();            //!!!! HIER HACKT's
                 
                           A.initA().setVisible(true);                   //!!!! HIER HACKT's
                }
            });
```



```
public class A extends JPanel{
    
   
    public  static JPanel initA(){
      
        ImageIcon image =
.....................................

        //Panels erstellen
        JPanel jPanel_a  = new JPanel();

..................................
/Panel zusammenstellen  
         GroupLayout jPanelsubaLayout = new GroupLayout(jPanel_a);
       
        jPanel_a.setLayout(jPanelaLayout);
        jPanel_a.setBackground(Menu.color_lightgray);
        jPanelsubaLayout.setHorizontalGroup(
            jPanelsubaLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
             ....................................
  return jPanel_a;
    }
    
}
```


----------



## SlaterB (25. Mai 2012)

> Panel.initComponents().setVisible(false);     
> Panel.initComponents().removeAll(); 

da fehlt einiges zu, so dass nicht alle Fehler direkt erwiesen sind, aber wahrscheinlich gilt:
- Panel ist eine Variable, Variablen immer klein schreiben, damit sie nicht mit Klassen verwechselt werden,
siehe Code-Darstellung hier im Forum, ein Variablenname Panel, der einer wichtigen API-Klasse entspricht, ist natürlich doppelt schlimm
- initComponents() liefert wahrscheinlich jedesmal ein neues JPanel zurück, allein schon zwei Aufrufe direkt hintereinander machen doch keinen Sinn, müssen ja verschiedene sein,
überhaupt brauchst du hier keinen einzigen neuen init-Aufruf, es ist ja wohl schon lange irgendwas zu sehen, das vorhandene JPanel brauchst du, muss irgendwo gespeichert sein
- wenn wie bei Klasse A (tolle Benennung) von JPanel geerbt wird, sollte die initMethode sicher besser gar kein neues JPanel erstellen sondern sich selber, this, initialiseren, dann hättest du auch leichtes Spiel für Aufrufe wie removeAll(), einfach auf das Objekt selber ausführen
- mit setVisible(false) + removeAll() und was dir noch so einfällt hast du wohl kein schlüssiges Konzept,
ein solches wäre CardLayout
How to Use CardLayout (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container)
das solltest du kennenlernen,
oder etwas weniger versteckt auch zum manuellen Umschalten:
How to Use Tabbed Panes (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)


----------



## plammy (25. Mai 2012)

SlaterB hat gesagt.:


> >
> - wenn wie bei Klasse A (tolle Benennung) von JPanel geerbt wird, sollte die initMethode sicher besser gar kein neues JPanel erstellen sondern sich selber, this, initialiseren, dann hättest du auch leichtes Spiel für Aufrufe wie removeAll(), einfach auf das Objekt selber ausführen



Versteh ich iwie nicht so ganz..


----------



## SlaterB (25. Mai 2012)

streiche das 'extends JPanel' in A, ändert sich dadurch irgendwas?
also ist die Vererbung nicht nötig

jetzt sehe ich dass es sogar eine statische Methode ist, dann ja noch weniger


----------



## plammy (25. Mai 2012)

Nein keine Änderung ..


----------



## SlaterB (25. Mai 2012)

also ich meinte dass es gut ist dass es da keine Änderung gibt, denn die Vererbung war unnötig,
man könnte sie nutzen, dann die Methode nicht statisch und dort kein JPanel erzeugen, 
aber das ist alles kompliziert ohne gewisses Verständnis, genug davon

--------

bei deinem Problem ist immer noch CardLayout die beste Lösung meiner Ansicht nach,
auch kein einfaches Thema wie es auf diesem Niveau ständig der Fall ist,
du musst dich durch meinen Link durcharbeiten, die Beispiele anschauen mit verschiedenen Cards die umgeschaltet werden

dann musst du (falls du diesem Vorschlag folgst) dein Programm umbauen so dass du auch mehrere Cards hast,

und schließlich als einfache Arbeit in die Menu-Listener den Umschalt-Befehl setzen

genaueres läßt sich vorerst nicht sagen, 'ich verstehe CardLayout nicht' würde auch nicht viel bringen,
wenn du aber den Code anschaust, übernimmst, intelligente Fragen a la 
'hier [+ Code] möchte ich Panel x als Card y einbauen, folgende Fehlermeldungen sagen mir aber ...'
stellst, dann kann man sicher wieder was dazu helfen


----------



## plammy (25. Mai 2012)

ich kann jetzt nicht alles neu umbauen .. für das nächste mal ja aber das ist jetzt so viel code das geht nicht.. ich muss das iwie so machen.. 

es brauche nur eine möglichkeit dass meine menüs funktionieren.. der rest geht ja


----------



## SlaterB (25. Mai 2012)

also der andere Weg auf die Schnelle wäre, nicht sicher:
wo wird Panel.initComponents() noch aufgerufen und dann diese JPanel in die GUI eingefügt?
an der Stelle musst du dieses JPanel-Objekt in einem Instanzattribut speichern und mit dem dann arbeiten,
nicht nochmal Panel.initComponents() aufrufen, zu A genauso


----------



## plammy (25. Mai 2012)

Also einmal in :


```
public class MainWindow extends JFrame {

    public MainWindow() {      
        
        setJMenuBar(Menu.MenuBar());   
        setContentPane(Panels.initComponents());
       

        pack();
        setTitle("Layout Tool");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    
    
  
    public static void main(String[] args) {
       

    java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
              new MainWindow().setVisible(true);
            }
        });
                
            }
      
}
```


... damit ich die mein Layout und die Menü auf dem Fenster zu sehen kriege und einmal:




```
public class Menu extends JPanel{
      
     protected static JMenu getMenuFile()



 JMenu file_menu = new JMenu("Datei"); 		
        file_menu.setForeground(color_orange);
        
        file_menu.setMnemonic(KeyEvent.VK_F);						

            // Untermenue "Neu" 
            JMenuItem file_menu_new = new JMenuItem("Neu");	
            
         
            
            
            // Untermenue "Oeffnen"		
            JMenuItem file_menu_open = new JMenuItem("\u00D6"+"ffnen");	  //\u00D6  = Ö
            
            file_menu_open.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent e){
                   JFileChooser filechooser = new JFileChooser();
                   int i = filechooser.showOpenDialog(null);
                   
                   if(i == JFileChooser.APPROVE_OPTION){
                       File file = filechooser.getSelectedFile();
                       String filepath = file.getPath();
                       
                       try {
                           BufferedReader br = new BufferedReader (new FileReader(filepath));
                           String str1="", str2="";
                            
                           while ((str1= br.readLine())!=null){
                               str2+=str1+"\n";
                           }
                       }catch (Exception ex){
                           ex.printStackTrace();
                       }
                   }
               }
            });
                 
                
            
            //Untermenue "Speichern"	
            JMenuItem file_menu_save = new JMenuItem("Speichern");
            
 
            
            
            // Untermenue "Speichern unter..." 
            JMenuItem file_menu_save_under = new JMenuItem("Speichern unter...");	
            
            
            
            // Untermenue "Drucken" 	
            JMenuItem file_menu_print = new JMenuItem("Drucken");	
            
            // Untermenue "Schliessen"
            JMenuItem file_menu_exit = new JMenuItem("Schlie"+"\u00DF"+"en");          
          
        
        file_menu.add(file_menu_new);
        file_menu.add(file_menu_open);
        file_menu.add(file_menu_save);
        file_menu.add(file_menu_save_under);
        file_menu.add(file_menu_print);
        file_menu.add(separator);
        file_menu.add(file_menu_exit);
   
        return file_menu;
    }
   
     
      protected static JMenu getMenuAdforms() {
    
        JMenu ads_menu = new JMenu("Werbemittel"); 		
       
       
            // Untermenue "Superbanner" 
            JMenuItem ads_menu_suba = new JMenuItem("Superbanner");	
              ads_menu_suba.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                  
                    Panels.initComponents().setVisible(false);
                    Panels.initComponents().removeAll();
                  
                    
                }
            });
              
            // Untermenue "Skyscraper" 
            JMenuItem ads_menu_sky = new JMenuItem("Skyscraper");
          
            // Untermenue "Medium Rectagle"
            JMenuItem ads_menu_medrec = new JMenuItem("Medium Rectagle");

            // Untermenue "Flashbuehne" 
            JMenuItem ads_menu_flashstage = new JMenuItem("Flashb"+"\u00FC" + "hne");

          
        ads_menu.add(ads_menu_suba);
        ads_menu.add(ads_menu_sky);
        ads_menu.add(ads_menu_medrec);
        ads_menu.add(ads_menu_flashstage);
          
        return ads_menu;
        
      }
      
      public static JMenuBar MenuBar(){
          
        JMenuBar menubar = new JMenuBar();
        
        menubar.add(getMenuFile());
        menubar.add(getMenuAdforms());
       
      
       return menubar;
          
      }

  
    
    
}



 {
```


bei den actionPerforms in den Menüeinträge...


----------



## SlaterB (25. Mai 2012)

>  setContentPane(Panels.initComponents());

hier hast das Panel und reichst es gleich weiter, speicheres es vorher in eine lokale Variable,
die du auch an Menu.MenuBar() danach als Parameter übergeben werden,
oder speichere in einer statische Variable, du hast ja sowieso soviel static,
jedenfalls mit diesem JPanel arbeiten


----------



## plammy (28. Mai 2012)

Jetzt öffnet es sich zumidest aber als neuer Fenster... immer noch nicht so wie ich es will in dem Hauptfenster drin.. 


Hab zumidest schon mal meine Menu-Klasse etwas ordentlicher geschrieben..

Problem bei :       
//Aktion bei Superbanner
 if (object.getSource() == suba){
... suba öffnet sich in einem externen fenster 


```
public class Menu extends JFrame implements ActionListener{
   
    
    
    //Menueleiste
    JMenuBar menubar;
    
    //Menueleiste Elemente
    JMenu file;
    JMenu ads;
    
    //Menue Datei
    JMenuItem neu;
    JMenuItem open;
    JMenuItem save;
    JMenuItem save_under;
    JMenuItem print;
    JMenuItem exit;
    
    //Menue Werbemittel
    JMenuItem suba;
    JMenuItem sky;
    JMenuItem medrec;
    JMenuItem fb;
    
    //Trennlinie
    JSeparator separator;
    

    
    public  JMenuBar getMenubar(){
        
      
        
        //Menueleiste erzeugen
        menubar = new JMenuBar();
        
        //Menueelemente erzeugen
        file = new JMenu("Datei"); 
        ads = new JMenu("Werbeformen");
        
        //Untermenues erzeugen
        neu = new JMenuItem("Neu");
        neu.addActionListener(this);
        
        open = new JMenuItem("\u00D6"+"ffnen");
        open.addActionListener(this);
        
        save = new JMenuItem("Speichern");
        save.addActionListener(this);
        
        save_under = new JMenuItem("Speichern unter...");
        save_under.addActionListener(this);
        
        print = new JMenuItem("Drucken");
        print.addActionListener(this);
        
        exit = new JMenuItem("Schlie"+"\u00DF"+"en");
        exit.addActionListener(this);
        
        suba = new JMenuItem("Superbanner");
        suba.addActionListener(this);
        
        sky = new JMenuItem("Skyscraper");
        sky.addActionListener(this);
        
        medrec = new JMenuItem("Medium Rectangle");
        medrec.addActionListener(this);
        
        fb = new JMenuItem("Flashnebueh");
        fb.addActionListener(this);
        
        //Menueelemente hinzufuegen
        menubar.add(file);
        menubar.add(ads);
        
        //Untermenueleiste hinzufuegen
        file.add(neu);
        file.add(open);
        file.add(save);
        file.add(save_under);
        file.add(print);
        file.add(exit);
        
        ads.add(suba);
        ads.add(sky);
        ads.add(medrec);
        ads.add(fb);
        
        return menubar;
    }
    

    public void actionPerformed(ActionEvent object) {
        
        //Aktion bei Neu
        if (object.getSource() == neu){
            System.out.println("öffnen wurde angeklickt");
        }
        
        //Aktion bei Oeffnen
        if (object.getSource() == open){
            JFileChooser filechooser = new JFileChooser();
            int i = filechooser.showOpenDialog(null);
                   
            if(i == JFileChooser.APPROVE_OPTION){
                File file = filechooser.getSelectedFile();
                String filepath = file.getPath();

                try {
                    BufferedReader br = new BufferedReader (new FileReader(filepath));
                    String str1="", str2="";

                    while ((str1= br.readLine())!=null){
                            str2+=str1+"\n";
                    }
                }catch (Exception ex){
                    ex.printStackTrace();
                }
            }
        }
        
        //Aktion bei Speichern
        if (object.getSource() == save){
            
        }
        
        //Aktion bei Speichern unter
        if (object.getSource() == save_under){
            JFileChooser fileChooser = new JFileChooser(); 
            // Auswahldialog oeffnen
            int returnValue = fileChooser.showSaveDialog(null);
            if(returnValue == JFileChooser.APPROVE_OPTION) {
                File f = fileChooser.getSelectedFile();
                try{
                    FileWriter fw = new FileWriter(f);
                    fw.write("");
                }catch (IOException ex){
                    ex.printStackTrace();
                }
            }
        }
            
        
        //Aktion bei Drucken
        if (object.getSource() == print){
            PrinterJob job = PrinterJob.getPrinterJob();
            job.printDialog();                
        }
        
        //Aktion bei Schliessen
        if (object.getSource() == exit){
            System.exit(0);
        }
        
        
        
         //Aktion bei Superbanner
        if (object.getSource() == suba){

            SuBa s = new SuBa();
            s.setVisible(true);
      
        }
        
        
        //Aktion bei Skyscraper
        if (object.getSource() == sky){
           
        }
        
        //Aktion bei Medium Rectangle
        if (object.getSource() == medrec){
           
        }
        
        //Aktion bei Flashbuehne
        if (object.getSource() == fb){
           
        }  
    }
}
```


----------



## plammy (28. Mai 2012)

und bei showOpenDialog .. wie sage ich da das Bild soll sich in meinem Panel 4 öffnen??? Hab echt kein schimmer..imer noch nciht..


```
public class RightPanel extends JFrame implements ActionListener{
        
   
    
    ArrayList<JTextField> tFields_x;
    ArrayList<JTextField> tFields_y;
    ArrayList<JLabel> labels;

    JButton button_ok;
    JButton button_reject;

    JPanel jPanel1;
    JPanel jPanel2;
    JPanel jPanel3; 
    JPanel jPanel4;
    JPanel panel;

   

    public JPanel getRightPanel(){

..........................

        //Panels erstellen
        jPanel1  = new JPanel();
        jPanel2  = new JPanel();
        jPanel3 = new JPanel(); 
        jPanel4 = new JPanel();
        panel = new JPanel();

         
        //Layout Panel 1 erstellen
        GroupLayout jPanel1Layout = new GroupLayout(jPanel1);
       
        jPanel1.setLayout(jPanel1Layout);
        jPanel1.setBackground(color_darkgray);
        
        Border titled_border = BorderFactory.createMatteBorder(2, 2, 2, 2, color_orange);
        
        Border tb_layout = BorderFactory.createTitledBorder(titled_border, "Layout", TitledBorder.LEFT, TitledBorder.TOP,font_border, color_orange);
        jPanel1.setBorder(tb_layout);
          
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
              ..........................................................



 //Layout Panel 4 erstellen
        GroupLayout jPanel4Layout = new GroupLayout(jPanel4);
        
        jPanel4.setLayout(jPanel4Layout);
        jPanel4.setBackground(color_lightgray);
        
        jPanel4Layout.setHorizontalGroup(
            jPanel4Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                .addGap(0, 600, Short.MAX_VALUE));
        jPanel4Layout.setVerticalGroup(
            jPanel4Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                .addGap(0, 0, Short.MAX_VALUE));

        
        //Gesamten Layout
        GroupLayout layout = new GroupLayout(panel);
        
        panel.setLayout(layout);
        panel.setBackground(color_darkgray);
        
        layout.setHorizontalGroup(
            layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addComponent(jPanel4)
                    .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                    .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                        .addComponent(jPanel1, GroupLayout.Alignment.TRAILING, 210, 210, 210)
                        .addComponent(jPanel2, GroupLayout.Alignment.TRAILING, 210, 210, 210)
                        .addComponent(jPanel3, GroupLayout.Alignment.TRAILING, 210, 210, 210))
                .addGap(0, 0, 5)));
        layout.setVerticalGroup(
            layout.createParallelGroup(GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING, false)
                    .addComponent(jPanel4)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jPanel1)        
                        .addComponent(jPanel2)
                        .addComponent(jPanel3)))
                .addGap(0, 0, 5)));
  
        return panel;
  
    }
```


----------



## SlaterB (28. Mai 2012)

was SuBa ist erwähnst du mit keinen Wort, soll man sich das selber denken?
na ja, dürfte klar sein, ein neues JFrame, die Alternative wäre ein JPanel ins schon vorhandene JFrame einzusetzen,
hattest du ja auch schon, muss ich eigentlich nicht erwähnen?

wenn ich 
> Hab echt kein schimmer..imer noch nciht..
lese, habe ich persönlich aber auch keine große Lust mehr, hier weiterzumachen,
du verstehst wenig davon, wenn ich Code vorschlage übernimmst du ihn vielleicht, aber weißt morgen schon nicht mehr,
was das war, für welches Problem, und stehst bald ohne Lernen vor demselben nochmal,

das ist kein sinnvolles Vorgehen


----------

