3 Stimmen

Wie kann JPanel entsorgt werden, nachdem das Panel aus dem JFrame entfernt wurde

Ich habe 2 Jpanel erstellt, die zu einem JFrame hinzugefügt werden.
Zuerst wird eines der JPanel dem JFrame hinzugefügt.
Ich habe die "add()" Methode des JFrame verwendet, um das JPanel hinzuzufügen.

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

Das JFrame hat eine JMenuBar darauf festgelegt.
Mit 2 JMenuItems, die zu einem JMenu hinzugefügt sind, das schließlich zur JMenuBar hinzugefügt wird.
Wenn auf das erste JMenuItem geklickt wird, wird das vorherige Panel aus dem JFrame entfernt und das andere JPanel dem JFrame hinzugefügt. Das 2. JMenuItem macht das Gegenteil, entfernt das vorherige JPanel und platziert das neuere JPanel.

JMenuItem a = new JMenuItem("p1");
a.addActionListener(new...
{
Frame2 ob = new Frame2();//eine andere Klasse, die Komponenten auf das Panel hinzufügt.
JPanel p1 = ob.getPanel();//Methode, die das JPanel aus einer anderen Klasse zurückgibt
j.getContentPane().remove(0);
j.getContentPane().add(p1);
});

JMenuItem b = new JMenuItem("p2");
a.addActionListener(new...
{
Frame3 ob2 = new Frame3();//eine andere Klasse, die Komponenten auf das Panel hinzufügt.
JPanel p2 = ob2.getPanel();//Methode, die das JPanel aus einer anderen Klasse zurückgibt
j.getContentPane().remove(0);
j.getContentPane().add(p2);
});

Das Problem, dem ich jetzt gegenüberstehe, ist, dass die Panels nicht entsorgt werden, wenn sie entfernt werden, und an irgendeiner Stelle im Speicher die Panels Speicher belegen.
Obwohl das vorherige Panel nicht sichtbar ist und das neuere Panel gesehen werden kann, kann der Speicher, den das vorherige Panel (nicht sichtbares Panel) belegt, im Task-Manager gesehen werden.
Und wenn ich zwischen den Panels wechsle, nimmt der von ihnen belegte Speicher zu, da jedes Mal eine neue Instanz des Panels erstellt wird. Ich möchte die Panels entsorgen, wenn sie entfernt werden, aber es gibt keine Methode, um ein JPanel zu entsorgen, wie die dispose() Methode für JFrame.

1voto

Pakka Techie Punkte 672

JFrame ist ein Fenster und JPanel ist ein Container. Sobald die JPanel-Instanz ihre Referenz verliert, wird sie vom Garbage Collector eingesammelt.

1voto

agent-p Punkte 144

Beim Betrachten des obigen Codes scheint ein Schritt zu fehlen. "remove()" entfernt den Verweis aus dem Inhaltsbereich, aber wenn die Panel-Variable nicht auf null gesetzt ist oder den Gültigkeitsbereich verlässt, wird das Panel immer noch einen Verweis haben und es wird nicht vom Garbage Collector eingesammelt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X