2010-12-16 2 views
3

Ich habe 2 Jpanel erstellt, die zu einem JFrame hinzugefügt werden.
Zuerst wird ein JPanel zum JFrame hinzugefügt.
Ich habe die "add()" Methode von JFrame verwendet, um JPanel hinzuzufügen.
Wie kann JPanel entsorgt werden, nachdem das Panel aus dem JFrame entfernt wurde

JPanel panel = new JPanel(); 
JFrame j = new JFrame(); 
j.getContentPane().add(panel); 

Die JFrame hat eine JMenuBar drauf gesetzt.
Mit 2 JMenuItems zu einem JMenu hinzugefügt, das schließlich zur JMenuBar hinzugefügt wird.
Das erste JMenuItem Wenn Sie darauf klicken, entfernen Sie das frühere Panel aus dem JFrame und fügen das andere JPanel dem JFrame hinzu. Das 2. JMenuItem führt die Umkehrung durch, entfernt den früheren JPanel und platziert den neueren JPanel.

JMenuItem a = new JMenuItem("p1"); 
a.addActionListener(new... 
{ 
Frame2 ob = new Frame2();//another class which adds components on the panel. 
JPanel p1 = ob.getPanel();//method used to return the JPanel from another class 
j.getContentPane().remove(0); 
j.getContentPane().add(p1); 
}); 


JMenuItem b = new JMenuItem("p2"); 
a.addActionListener(new... 
{ 
Frame3 ob2 = new Frame3();//another class which adds components on the panel. 
JPanel p2 = ob2.getPanel();//method used to return the JPanel from another class 
j.getContentPane().remove(0); 
j.getContentPane().add(p2); 
}); 

Das Problem, das ich jetzt Gesicht ist, dass die Platten in dem Speicher, wenn sie entfernt und irgendwo bekommen angeordnet DONot die Platten Speicher occupuing.
Obwohl das vorherige Panel nicht sichtbar ist und das neuere Panel zu sehen ist, kann der Speicher, den das vorherige Panel (nicht sichtbares Panel) belegt, im Task-Manager angezeigt werden.
Und wenn ich zwischen den Panels umschalte, wird der Speicher, den sie okkutiv machen, immer größer, da jedes Mal eine neue Instanz des Panels erstellt wird. Ich möchte die Panels entfernen, wenn sie entfernt werden, aber es gibt keine Methode, ein JPanel wie die dispose() - Methode für JFrame zu entsorgen.

+0

Haben Sie versucht 'setVisible (false)'? – khachik

+0

ich möchte das Panel nicht ausblenden Ich möchte das Panel entfernen, nachdem der Benutzer andere Panel aus der Menüleiste klickt, wie der Menüeintrag p2 – Jaguar

Antwort

1

JFrame ist Fenster und JPanel ist ein Container. In dem Moment, in dem die JPanel-Instanz ihre Referenz verliert, wird sie als Müll gesammelt.

+0

1) 'JFrame' ist auch ein Container. 2) Es ist wahr, aber AFAIU 'JPanel' verliert seine Referenzen nicht, wenn es aus dem Rahmen entfernt wird. – khachik

+0

es sollte Müll gesammelt werden, aber es ist nicht. Ich denke, dass die remove() -Methode nicht seine Referenz verliert und nur das Panel – Jaguar

+0

@Jaguar verbirgt, wenn es Müll gesammelt wird, können Sie nicht mehr hinzufügen. Du brauchst es also nicht, um Müll zu sammeln (oder ich habe deine Frage nicht bekommen). – khachik

1

Mit Blick auf den Code oben sieht es aus, als ob ein Schritt verpasst wird. "remove()" entfernt den Verweis aus dem Inhaltsbereich, aber wenn die Feldvariable nicht auf null gesetzt ist oder den Gültigkeitsbereich verlässt, hat das Fenster weiterhin einen Verweis und es wird kein Garbage Collector erfasst.

Verwandte Themen