JInternalFrame megszüntetése

Fórumok

Egy JFrame típusú objektumban akarok egy (csak egy!) JInternalFrame objektumot nyitni. Betettem egy objektum számlálót az osztályba. Ezt az objektum létrehozásakor növelem eggyel és megszüntetésekor csökkentem.

A gond az, hogy a finalize() függvény nem fut le az InternalFrame bezárásakor. Mit kell beállítanom, hogy a finalize() lefusson?


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

public class MyInternalFrame extends JInternalFrame {

    static int openFrameCount = 0;

    public MyInternalFrame() {
        super("Document #" + (++openFrameCount), 
              true, //resizable
              true, //closable
              true, //maximizable
              true);//iconifiable
        setSize(300,300);
    }
    
    @Override
    protected void finalize() throws Throwable
    {
        --openFrameCount;
        System.out.println("finalize() lefutott!");
        super.finalize(); 
    }
    
} // end of class

Hozzászólások

A finalize() -t a GC hívja akkor, amikor már semmilyen referencia nincs az objektumodra. Szűntesd meg az összes referenciát és akkor talán "finalizálódik" az objektumod(a GC semmilyen garanciát nem ad rá tudomásom szerint). Ha ragaszkodsz ahhoz, hogy csak egyetlen egy ablakod lehessen akkor ajánlom a Singleton pattern-t.

A megoldást már leírták, csak annyi, hogy a finalize() -ra ne nagyon építs! Nincs 100% garantálva, hogy lefut, illetve nem tudhatod, hogy mikor fut le. Ilyen a GC. :)