2010-03-15 5 views
10

Ho creato una finestra di dialogo con un jpanel al suo interno e quel jpanel sarà ancora referenziato se mi sbarazzerò della finestra di dialogo. Voglio distruggere quella finestra di dialogo e tutto ciò che contiene quando faccio clic su un pulsante Annulla. Come posso cancellare sia la finestra di dialogo che la jpanel?Come si elimina un oggetto referenziato da una finestra di dialogo?

+5

MyClass o = new Myclass(); o = null; – gpampara

risposta

10

Rispondendo alla domanda (s) è posta nel comment:.

Una volta visualizzata una finestra di dialogo:

setVisible(true); 

si nasconde chiamando:

setVisible(false); 

e quindi è necessario chiamare:

dialog.dispose(); 

per assicurarsi che tutte le risorse GUI native la finestra di dialogo usata viene liberata. Una volta fatto questo, il garbage collector pulirà tutti gli oggetti quando non avrai più riferimenti.

+0

e se non è una finestra di dialogo. Può essere una semplice classe? Quindi quale suggerirai? – Sameer

+0

Se è una classe semplice, viene "distrutta" dal garbage collector una volta che non hai più riferimenti. –

+0

Penso che dovrebbe accadere anche con la classe di dialogo. – Sameer

4

Non è necessario eliminare l'oggetto. Il garbage collector si prenderà cura della memoria non appena non sarà più referenziata.

+0

ma creo una finestra di dialogo con jpanel al suo interno e quel jpanel sarà ancora referenziato. Voglio distruggere quella finestra di dialogo quando clicco sul mio pulsante "Annulla" – joseph

+0

Quindi puoi impostarlo su null – RubyDubee

+0

@joseph: Rimuovi il 'JPanel' dalla finestra di dialogo quando lo chiudi, se hai intenzione di mantenere un riferimento al 'JPanel'. Ciò impedirà a 'JPanel' di mantenere un riferimento al dialogo e di mantenerlo (il dialogo) in giro. –

2

Intendevi "come" distruggerlo? Non c'è modo di distruggere un oggetto esplicitamente in Java. Garbage Collector in Java recupera automaticamente la memoria occupata da esso Se non esiste alcun riferimento dello stesso esiste.

", ma creo dialogo con JPanel al suo interno, e che JPanel sarà ancora referrenced. Io voglio distruggere che dialogo, quando clicca il mio tasto 'Cancel'

Basta provare impostazione che oggetto JPanel a NULL o chiamare il metodo Dispose su di essa se questo è disponibile

2

Se si desidera eliminare assegnare il riferimento oggetto a null, in modo che quando Garbage Collector viene eseguito per la volta successiva, può distruggere l'oggetto pensando che non venga referenziato.

3

È possibile sovrascrivere il metodo finalize() (vedere http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html#finalize%28%29) per eseguire la pulitura quando un oggetto viene distrutto.

Tuttavia, a differenza del C++ non è garantito quando verrà chiamato questo metodo. In C++ hai oggetti memorizzati nello stack che vengono distrutti quando l'esecuzione lascia l'ambito in cui sono stati definiti.

In Java tutti gli oggetti sono memorizzati nell'heap. Saranno finalizzati quando il Garbage Collector decide di raccoglierli (implica che non sono raggiungibili dalla tua app) ma non sai quando il GC prenderà il via. Quindi, se hai qualche ripulitura che deve aver luogo ad un certo punto (ad esempio, chiudendo un file in modo che possa essere scritto) devi codificarlo da solo e non fare affidamento sul metodo finalize().

Il modello tipico per fare che si basa su un blocco try ... finally:

X x = null; 
try { 
    // ... do some stuff 
    x = ... // obtain an object 
    ... // do some stuff 
} 
finally { 
    if(x != null) 
    x.close(); // Perform cleanup WRT x 
} 

(Certo, brutto)

2

Non c'è bisogno di distruggere oggetti in Java nel modo come in C++.C'è un garbage collector che distrugge (rilascia memoria utilizzata da) oggetti automaticamente dopo che non ci sono riferimenti a questo oggetto nel codice in esecuzione. Tutto ciò che puoi fare è forzare la distruzione del collegamento tramite Object obj = null; Questo uccide il riferimento a obj.

5
  1. Se si tratta di una finestra e se è visibile

    I. frame.setVisible (false);

    II. frame.dispose();

    II. riferimento impostato su null (es .. frame = null;)

  2. Se non è una finestra di riferimento

    I.set su null (es .. x = null;)

Questo è tutto, una volta che l'oggetto è libero GC libererà le risorse quando è come.

Ecco quarantina è necessario comprendere

*. Tu come programmatore Java non puoi forzare la Garbage collection in Java; si attiverà solo se JVM ritiene di aver bisogno di una garbage collection basata sulla dimensione heap Java.

*. Esistono metodi come System.gc() e Runtime.gc() che viene utilizzato per inviare la richiesta di Garbage Collection a JVM ma non è garantito che si verifichi la garbage collection.

*. Se non c'è spazio di memoria per la creazione di nuovo oggetto in Heap Java Virtual Machine getta OutOfMemoryError o java.lang.OutOfMemoryError mucchio spazio

E la ricerca su questo ...

J2SE 5 (Java 2 Standard Edition) aggiunge una nuova funzionalità chiamata Ergonomia. L'obiettivo dell'ergonomia è quello di fornire buone prestazioni dalla JVM con il minimo di messa a punto della linea di comando.

1

"System.gc()" è il modo migliore.

gc-Garbage Collector.

Questo è come si sta andando distruggere l'oggetto nel programma stesso

codice di esempio:

public class TestRun 
{ 
    public static void main(String args[]) 
    { 
    /*1*/  TestRun tr=new TestRun(); 
    /*2*/  System.gc(); //You can omit this step. This is just an example. 
    /*3*/  tr=null;  
    /*4*/  System.gc(); 
    }  
} 

Spiegazione

  1. un oggetto della classe TestRun è creato e il suo riferimento è memorizzato nella variabile 'tr'.

  2. Viene chiamato il garbage collector. Ma non ha alcun effetto. Perché nessun oggetto è ancora dereferenziato.

  3. L'oggetto creato nel passaggio 1 è ora dereferenziato.Ma lo spazio che era occupato dall'oggetto è ancora bloccato da esso.

  4. Viene nuovamente richiamato Garbage Collector e ora vede che l'oggetto creato nel passaggio 1 è ora dereferenziato. Quindi, ora libera lo spazio occupato dall'oggetto e l'oggetto viene ora cancellato dalla memoria in un linguaggio semplice.

Infatti eliminerà tutti quegli oggetti che sono già dereferenziati.

È buona prassi continuare a chiamarlo nel codice.

Problemi correlati