web-dev-qa-db-fra.com

Comment supprimer un objet référencé par un dialogue?

J'ai créé un dialogue avec un jpanel à l'intérieur, et ce jpanel sera toujours référencé si je supprime le dialogue. Je veux détruire ce dialogue et tout ce qu'il contient lorsque je clique sur un bouton d'annulation. Comment supprimer le dialogue et le jpanel?

10
joseph

Répondre à la (aux) question (s) que vous avez posée dans le commentaire :

Une fois que vous avez affiché une boîte de dialogue:

setVisible(true);

vous le cachez en appelant:

setVisible(false);

et ensuite vous devez appeler:

dialog.dispose();

pour vous assurer que toutes les ressources de l'interface graphique native utilisées dans la boîte de dialogue sont libérées. Une fois que cela est fait, le ramasse-miettes nettoie tous les objets une fois que vous n’avez plus aucune référence à eux.

10
David Sykes
  1. Si c'est une fenêtre et si elle est visible 

    I. frame.setVisible (false);

    II. frame.dispose ();

    II. définir la référence sur null (ex. frame = null;)

  2. Si ce n'est pas une fenêtre

    I.set référence à null (ex. X = null;)

C'est tout, une fois que l'objet sera libre, GC libérera les ressources quand il ressemblera à

Voici quelque chose que vous devez comprendre 

*. En tant que programmeur Java vous ne pouvez pas forcer la récupération de place en Java; cela ne se déclenchera que si JVM pense avoir besoin d'une récupération de place basée sur la taille du tas Java.

*. Il existe des méthodes telles que System.gc () et Runtime.gc () qui est utilisé pour envoyer la demande de récupération de place à la machine virtuelle, mais il n'est pas garanti qu'une telle opération ait lieu .

*. S'il n'y a pas d'espace mémoire pour la création d'un nouvel objet dans la pile, la machine virtuelle Java lève l'espace de pile OutOfMemoryError ou Java.lang.OutOfMemoryError.

Et chercher à ce sujet ...

J2SE 5 (Java 2 Standard Edition) ajoute une nouvelle fonctionnalité appelée Ergonomie . L’objectif de l’ergonomie est de fournir de bonnes performances de la machine virtuelle avec un minimum de réglage en ligne de commande.

5
Lalith J.

Pas besoin de supprimer l'objet. Le ramasse-miettes s’occupe de la mémoire dès qu’elle n’est plus référencée.

4
Raul Agrait

Vous pouvez remplacer la méthode finalize () (voir http://Java.Sun.com/j2se/1.4.2/docs/api/Java/lang/Object.html#finalize%28%29 ) pour effectuer nettoyage lorsqu'un objet est détruit.

Cependant, contrairement au C++, rien ne garantit quand cette méthode sera appelée. En C++, vous avez des objets stockés dans une pile qui sont détruits lorsque l'exécution quitte la portée dans laquelle ils ont été définis. 

En Java, tous les objets sont stockés sur le tas. Ils seront finalisés lorsque le ramasse-miettes décide de les récupérer (implique qu'ils ne sont pas accessibles depuis votre application), mais vous ne savez pas quand le GC va entrer en jeu. Ainsi, si vous avez un nettoyage à effectuer à une certaine point (par exemple, fermer un fichier pour qu’il puisse être écrit), vous devez le coder vous-même et ne pas compter sur la méthode finalize () appelée.

Le modèle typique pour ce faire est basé sur un bloc 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
}

(Certes, moche)

3
Itay Maman

Vous vouliez dire "comment" le détruire? Il n'y a aucun moyen de détruire un objet explicitement en Java. garbage collector en Java récupère automatiquement la mémoire occupée par ce dernier s'il n'existe aucune référence de la même chose.

"mais je crée un dialogue avec jpanel à l'intérieur, et ce jpanel sera toujours référencé. Je veux détruire ce dialogue en cliquant sur mon propre bouton " Annuler"

Essayez simplement de définir la valeur null de cet objet JPanel ou d’appeler la méthode de disposition dessus si celle-ci est disponible.

2
Ashish Gupta

Si vous souhaitez supprimer la référence d'assignation de cette référence d'objet à null, vous pouvez ainsi le détruire lors de la prochaine exécution de Garbage Collector en pensant qu'il n'est pas référencé.

2
GuruKulki

Il n’est pas nécessaire de détruire un objet en Java de la même manière qu’en C++, il existe un garbage collector qui détruit automatiquement (libère la mémoire utilisée par) les objets après qu’il n’y ait pas de référence à cet objet dans le code en cours d’exécution. Tout ce que vous pouvez faire est de forcer le lien de destruction par Object obj = null; Ceci tue la référence à obj.

2
Artic

"System.gc ()" est le meilleur moyen.

gc-Garbage Collector.

Voici comment vous allez détruire l'objet dans le programme lui-même

Exemple de code:

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();  
  }    
}

Explication

  1. Un objet de classe TestRun est créé et sa référence est stockée dans la variable 'tr'.

  2. Garbage Collector s'appelle. Mais ne fait aucun effet. Parce qu'aucun objet n'est encore déréférencé.

  3. L'objet créé à l'étape 1 est maintenant déréférencé. Mais l'espace qui était occupé par l'objet est toujours bloqué par celui-ci.

  4. Garbage Collector est à nouveau appelé et il voit maintenant que l'objet créé à l'étape 1 est maintenant déréférencé. Par conséquent, il libère maintenant l'espace occupé par l'objet et celui-ci est maintenant supprimé de la mémoire en langage simple.

En fait, tous les objets déjà référencés seront supprimés.

C'est une bonne pratique de continuer à l'appeler dans votre code. 

1
Aditya Singh