# Problem mit JFrame und Panel (Schliessen eines JFrame)



## Yourtime (2. Jun 2006)

Hallo ich habe ein problem ich muss in der schule ein programm schreiben und zwar ein Vokabeltrainer 
und wir haben in letzter zeit gelernt dynamische Datenstrukturen 

mein problem ist 

ich habe ein klasse das öffnet ein frame und das  einen panel ... ich möchte das mein panel  auf den frame zu greifen kann 

mir sind nicht viele möglichkeiten eingefallen... 
so habe ich eine neue klasse (frame close) gemacht . diese klasse wird geöffnet vom JFRAME und das jframe gibt in die klasse (frame close ) das selbe frame. später öffnet das Panel --> frame close  (NEW FRAME CLOSE) und startet die methode closeframe() und  soll halt den FRAME schliessen den ich eingelesen haben

mein problem ist das  ich nur den befehl kenne für einen new frame close und  somit die eingelesen frame =null ist und somit kommt ein fehler 

ich will aber beim panel --> das gleiche öffnen wie bei jframe 

ich habe hier auch die codes:
Testklasse:


```
import javax.swing.*;
import java.awt.*; 
import java.awt.event.*; 
public class TestVokabelFrame
{
    public static void main(String[]args)
    {
        VokabelFrame frame= new VokabelFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.show(); 
    }
}
```


-------


```
import javax.swing.*;
import java.awt.*; 
import java.awt.event.*; 
public class VokabelFrame extends JFrame
{    
    public VokabelFrame()
    {
        setTitle("Vok Trainer Version 1.0"); 
        setSize(200,150); 
        setLocation(200,200);
        setVisible(true);
        VokabelPanel a= new VokabelPanel();
        getContentPane().add(a); 
       }
}
```



```
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
public class VokabelPanel extends JPanel
    {
        public JButton eingeben;
        public JButton bearbeiten;
        public JButton auflisten;
        public JButton training;
        public JPanel eingebenPanel;
        public JFrame vokabelFrame2;
        public buttonFrame b= new buttonFrame();
        public int[]var =new int[4];
        
    
    public VokabelPanel()
    {
        setLayout(new GridLayout(4,0));
        eingeben = new JButton("Daten Eingeben");
        bearbeiten  = new JButton("Daten Bearbeiten");
        auflisten  = new JButton("Daten auflisten");
        training  = new JButton("Vok Training");
        add(eingeben);
        add(bearbeiten);
        add(auflisten);
        add(training);
        Handling x= new Handling();
        eingeben.addActionListener(x);
        training.addActionListener(x);
        auflisten.addActionListener(x);
        bearbeiten.addActionListener(x);
    }
    public class Handling  implements ActionListener
    {
         public void actionPerformed(ActionEvent e)
        {    
            if(e.getSource()==eingeben && var[0]!=1)
            {               
                buttonFrame a = new buttonFrame();
                a.eingebenFrame();
                
                
               
            }
            if(e.getSource()==bearbeiten && var[1]!=1)
            {               
                buttonFrame b = new buttonFrame();
                b.bearbeitenFrame();
                
            }
            if(e.getSource()==auflisten && var[2]!=1)
            {               
                buttonFrame c = new buttonFrame();
                c.auflistenFrame();
                
                
            }
            if(e.getSource()==training && var[3]!=1)
            {               
                buttonFrame d = new buttonFrame();
                d.trainFrame();
              

              
                
            }
            
                
            }
            
        }
    }
```

-------


```
public class buttonFrame extends JFrame
{
    
    public buttonFrame()
    {
        setTitle("Vok Trainer Version 1.0"); 
        
    }
    public void eingebenFrame()
    {
        setSize(515,53); 
        setLocation(400,200);
        eingebenPanel a= new eingebenPanel();
        getContentPane().add(a); 
        setVisible(true);
        frameClose z = new  frameClose(this);
    }
```

--------


```
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
public class frameClose extends JFrame
{
    public int a;
    public JFrame ad;
    public frameClose(JFrame af)
    {
       ad = af;
    }
    public frameClose()
    {}
       public void closeFrame()
       {
           ad.setVisible(false);
       }
}
```

----


```
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
public class eingebenPanel extends JPanel
{
    public boolean klick;
    public JButton ok = new JButton("Ok");;
    public JTextField oben=new JTextField();
    public JTextField unten=new JTextField();
    public JLabel linkstext=new JLabel("Name");
    public JLabel rechtstext=new JLabel("Übersetzung");
    public eingebenPanel()
    {
        setLayout(null);
        linkstext.setBounds(0,0,50,25);
        oben.setBounds(50,0,150,25);
        rechtstext.setBounds(205,0,75,25);
        unten.setBounds(285,0,150,25);
        ok.setBounds(440,0,50,25);
        add(oben);
        add(ok);
        add(unten);
        add(oben);
        add(linkstext);
        add(rechtstext);
        Handling handle = new Handling();
        ok.addActionListener(handle);
        
}
  
 public class Handling  implements ActionListener
    {
         public void actionPerformed(ActionEvent e)
        {   
           if(e.getSource()==ok)
           {
            
               frameClose a = new frameClose();
               a.closeFrame();
            }
        }
    }
}
```




Ich hoffe ihr könnt mir helfen =/


----------



## The_S (2. Jun 2006)

nö, ich versteh kein wort   was willst du jetzt genau machen?


----------



## Yourtime (2. Jun 2006)

ich habe ein JPanel ja? 

und das wird mit einem JFrame ja gestartet! 

und ich habe auf meinem JPanel --> einem button (OK) und ich will wenn ich diesen button drücke das ich das FRAME nicht mehr sehe 

also entweder schließe oder visible(false) mache 

nur wie greife ich mit einem JPANEL auf die andere Klasse also JFRAME zu ? =/


----------



## Yourtime (2. Jun 2006)

So habe mich mal angemeldet und werde mal das so editieren das vll man es besser versteht

```
import javax.swing.*;
import java.awt.*; 
import java.awt.event.*; 
/**
/*import sachen
*/
public class TestVokabelFrame
{
    public static void main(String[]args)
    {
        VokabelFrame frame= new VokabelFrame(); // startet die Frame Klasse
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Close methode ( beim x)
        frame.show(); // is zwar bald depricated aber egal zum anzeigen des frames
    }
}
```


-------


```
import javax.swing.*;
import java.awt.*; 
import java.awt.event.*; 
/**
/*import sachen ^^
*/
public class VokabelFrame extends JFrame // Frame klasse
{    
    public VokabelFrame() // Konstruktor
    {
        setTitle("Vok Trainer Version 1.0");  // Title
        setSize(200,150); // Größe
        setLocation(200,200); // Wo 
        setVisible(true); // Frame wird angezeigt 
        VokabelPanel a= new VokabelPanel(); // HAUPTPANEL wird gestartet
        getContentPane().add(a);  // Content fügt den Panel hinzu
       }
}
```



```
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
/**
/* import dinger
*/
public class VokabelPanel extends JPanel
    {
        public JButton eingeben; // der erste button zum eingeben  Von Vokabeln
        public JButton bearbeiten; // 2. Button zum bearbeiten zum bearbeiten von vokabeln
        public JButton auflisten; // 3. Button zum Auflisten ALLER vokabeln
        public JButton training; // 4. Button für ein Training
        public buttonFrame b= new buttonFrame(); // 2. FRAME zum starten aller Panel in einer KLASSE

    public VokabelPanel() // Konstruktor
    {
        setLayout(new GridLayout(4,0)); // Layout des Panel
        eingeben = new JButton("Daten Eingeben"); 
        bearbeiten  = new JButton("Daten Bearbeiten");
        auflisten  = new JButton("Daten auflisten");
        training  = new JButton("Vok Training");
        // buttons werden angezeigt
        add(eingeben);
        add(bearbeiten);
        add(auflisten);
        add(training);
        Handling x= new Handling(); // ActionListener
        // buttons werden regestiert
        eingeben.addActionListener(x);
        training.addActionListener(x);
        auflisten.addActionListener(x);
        bearbeiten.addActionListener(x);
    }
    public class Handling  implements ActionListener
    {
         public void actionPerformed(ActionEvent e)
        {    
            if(e.getSource()==eingeben) // wenn man auf die var eingeben klickt soll buttonFrame gestartet werden
            {               
                buttonFrame a = new buttonFrame();
                a.eingebenFrame(); // führt den Frame EINGEBEN aus
            }
            
                
          }
            
        }
    }
```

-------


```
public class buttonFrame extends JFrame // KLASSEzum starten aller FRAMES und öffnen ALLER PANELS
{
    
    public buttonFrame() // Konstruktor
    {
        setTitle("Vok Trainer Version 1.0");  // Title
        
    }
    public void eingebenFrame()
    {
        setSize(515,53);  // Größe
        setLocation(400,200);// WO
        eingebenPanel a= new eingebenPanel(); // Starten des panels eingeben von frame eingeben
        getContentPane().add(a); // Content fügt  panel hinzu
        setVisible(true);// panel wird sichtbar
        frameClose z = new  frameClose(this); // Framclose bekommt diesen frame
    }
```

--------


```
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
//import dinger
public class frameClose extends JFrame
 // die klasse soll das jenige frame schliessen ... ich habe sie aus dem bauch geschrieben und deshalb so komische var namen
{
    public JFrame ad; // ein leerer frame wird erzeugt 
    public frameClose(JFrame af) // 1. konstruktor mit jframe als attribut
    {
       ad = af; // leerer  übernimmt neuen
    }
    public frameClose()//  2. konstruktor für die andere klasse (Panel)
    {}
       public void closeFrame()//  methode zum schliessen bzw zum unsichtbar machen
       {
           ad.setVisible(false); // befehl : unsichtbar
       }
}
```

----


```
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
// import jaja
public class eingebenPanel extends JPanel
{
    public JButton ok = new JButton("Ok");; // ok button zum speichern und schließen des frames
    public JTextField oben=new JTextField(); // eingabe feld für name
    public JTextField unten=new JTextField(); // eingabe feld für übersetzung
    public JLabel linkstext=new JLabel("Name"); // label für "name"
    public JLabel rechtstext=new JLabel("Übersetzung"); //label für Übersetung
    public eingebenPanel() // konstruktor
    {
        setLayout(null); // null layout für diesen Panel
        //setzen der daten
        linkstext.setBounds(0,0,50,25); 
        oben.setBounds(50,0,150,25);
        rechtstext.setBounds(205,0,75,25);
        unten.setBounds(285,0,150,25);
        ok.setBounds(440,0,50,25);
        // anzeigen der daten
        add(oben);
        add(ok);
        add(unten);
        add(oben);
        add(linkstext);
        add(rechtstext);
        Handling handle = new Handling();// actionListener
        //reg. der daten ( daweil nur ok wegen dem problem)
        ok.addActionListener(handle);
        
}
  
 public class Handling  implements ActionListener // ActionListener
    {
         public void actionPerformed(ActionEvent e)
        {   
           if(e.getSource()==ok) //  ob  ok gedrückt wird
           {
            
               frameClose a = new frameClose(); // Führ 1. Konstruktor aus um dann frame zu schliessen
               a.closeFrame(); // methode schließt bzw macht  frame unsichtbar
            }
        }
    }
}
```


also jetzt hoffe ich das das jeder versteht

das was ich gemacht habe ist eine lösung aber es hat einen hacken ..... er öffnet nicht die gleiche  klasse(frameClose) sonder eine neue und somit ist der JFrame af leer(NULL) =/


----------



## Yourtime (2. Jun 2006)

kann mir echt keiner helfen ? =/ .... oder braucht ihr mehr infos oder kann ich was erkären was ihr nicht versteht >_<


----------



## Caffè Latte (2. Jun 2006)

Hi,

ich verstehe es irgendwie nicht. Und so viel Code will ich auch nicht lesen. 

Wenn ich in meinen Forms einen Menüeintrag, einen Button oder sonst was habe, um das Form zu schliessen, dann geht das immer mit "this.dispose();" - egal wo das Ding ist (in einem Menu, einem Panel etc.).

Wenn ich allerdings ein  Form aus einem anderen Form schliessen möchte, dann bau ich auch eine Schliessenmethode ein, die wieder "this.dispose()" ausführt. Diese öffentliche Methode zum Schliessen des Form rufe ich dann mit "_instanzname.methodenname()_" auf.

Statt dispose geht natürlich auch setVisible() und was so ein Form eben sonst noch so hergibt.


----------



## Yourtime (2. Jun 2006)

ok ich werde es mal testen danke mal im vorraus =)

ehm eine frage ist 

ich habe in einer anderen klasse a eine klasse b geöffnet ( sie ist offen)
dann öffne ich mit der klasse a noch eine klasse c und jetzt möchte ich mit klasse c auf klasse b zugreifen ohne das ich sie NEU öffne 

wie mache ich das? erben kann ich ja nicht weil ich zb schon erbe von JFrame

thx im vorraus


this.dispose() funktioniert irgendwie nicht


----------



## Yourtime (3. Jun 2006)

=/ kann mir jemand helfen ? ._.

mfg.yT


----------



## Yourtime (14. Jun 2006)

also nach dem mir keiner helfen konnte und mir die antwort this.dispose nicht geholfen hat zuerst 

musste ich mal 2 lehrer fragen ... und die api genauestens studieren  .. also  ihr beispiel zu windowlistener

habe  dann endeckt das ich einfach windowlistener auch gut funktioniert( das mit windowsadapter habe ich nicht hingekriegt) 

und habe dann auch herausgefunden zum befehl this(JFRAME).dispose brauche :/ was ich auch nicht wusste...

habs umgeändert und es funktioniert 


denn das einzigste was ich wollte war 
Mit 1 button das Frame schließen ( aber nicht mit System.exit(0)

Das Problem war
JFrame und JPanel waren in einer eigenen klasse ... deshalb wusste ich nicht wie ich das machen soll 
trotzdem thx... für die naja versuchende hilfe


----------

