Il n'existe pas en java de mot clef "delete" comme en c/c++ pour
supprimer une variable (vive le garbage collector qui gère tout).
Cependant je me heurte à un léger problème (qui vient sans doute de
l'utilisation des swing)
Mon code simplifié est le suivant:
class Toto {
private class Gui {
Gui() {
_frame = new JFrame();
...
_frame.setVisible(true);
}
private JFrame _frame;
}
Toto() {
_gui = new Gui();
}
private Gui _gui;
static void test() {
Toto toto = new Toto();
}
static void main() {
test();
test();
}
}
Quand j'execute ce code, j'obtiens l'affichage de 2 fenetres.
Or quand la fonction test() se termine, la variable toto de cette
fonction n'est plus utilisée, et devrait donc être supprimée, et donc
aussi l'interface graphique et tout.
Mais non!!!
Comment faire en sorte que ca supprime tout?
J'ai essayé de metrte toto = null; juste avant de sortir de la fonction
test(), mais ca n'y change rien.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Insitu
Bonjour,
Alex writes:
Il n'existe pas en java de mot clef "delete" comme en c/c++ pour supprimer une variable (vive le garbage collector qui gère tout).
Une variable n'est jamais "supprimée", en tout cas pas en c++ ni en java. La destruction explicite du c++ (et le free du c) "suppriment" l'objet représenté par la variable.
Cependant je me heurte à un léger problème (qui vient sans doute de l'utilisation des swing)
Mon code simplifié est le suivant:
class Toto { private class Gui { Gui() { _frame = new JFrame(); ... _frame.setVisible(true); } private JFrame _frame; }
Toto() { _gui = new Gui(); } private Gui _gui;
static void test() { Toto toto = new Toto(); }
static void main() { test(); test(); } }
Quand j'execute ce code, j'obtiens l'affichage de 2 fenetres. Or quand la fonction test() se termine, la variable toto de cette fonction n'est plus utilisée, et devrait donc être supprimée, et donc aussi l'interface graphique et tout. Mais non!!!
Eh non :-) Le fait d'utiliser l'interface graphique swing (ou plutôt awt) crée un fil d'exécution (un Thread) AWTEventThread. Quand main se termine, ce fil qui n'est pas en mode daemon continue de s'exécuter donc l'application fonctionne encore.
Comment faire en sorte que ca supprime tout?
dispose() par exemple, ou fermer les fenêtres.
Merci
de rien
insitu.
Bonjour,
Alex <compuhelp@free.fr> writes:
Il n'existe pas en java de mot clef "delete" comme en c/c++ pour
supprimer une variable (vive le garbage collector qui gère tout).
Une variable n'est jamais "supprimée", en tout cas pas en c++ ni en java.
La destruction explicite du c++ (et le free du c) "suppriment" l'objet représenté
par la variable.
Cependant je me heurte à un léger problème (qui vient sans doute de
l'utilisation des swing)
Mon code simplifié est le suivant:
class Toto {
private class Gui {
Gui() {
_frame = new JFrame();
...
_frame.setVisible(true);
}
private JFrame _frame;
}
Toto() {
_gui = new Gui();
}
private Gui _gui;
static void test() {
Toto toto = new Toto();
}
static void main() {
test();
test();
}
}
Quand j'execute ce code, j'obtiens l'affichage de 2 fenetres.
Or quand la fonction test() se termine, la variable toto de cette
fonction n'est plus utilisée, et devrait donc être supprimée, et donc
aussi l'interface graphique et tout.
Mais non!!!
Eh non :-) Le fait d'utiliser l'interface graphique swing (ou plutôt awt)
crée un fil d'exécution (un Thread) AWTEventThread. Quand main se termine,
ce fil qui n'est pas en mode daemon continue de s'exécuter donc l'application
fonctionne encore.
Il n'existe pas en java de mot clef "delete" comme en c/c++ pour supprimer une variable (vive le garbage collector qui gère tout).
Une variable n'est jamais "supprimée", en tout cas pas en c++ ni en java. La destruction explicite du c++ (et le free du c) "suppriment" l'objet représenté par la variable.
Cependant je me heurte à un léger problème (qui vient sans doute de l'utilisation des swing)
Mon code simplifié est le suivant:
class Toto { private class Gui { Gui() { _frame = new JFrame(); ... _frame.setVisible(true); } private JFrame _frame; }
Toto() { _gui = new Gui(); } private Gui _gui;
static void test() { Toto toto = new Toto(); }
static void main() { test(); test(); } }
Quand j'execute ce code, j'obtiens l'affichage de 2 fenetres. Or quand la fonction test() se termine, la variable toto de cette fonction n'est plus utilisée, et devrait donc être supprimée, et donc aussi l'interface graphique et tout. Mais non!!!
Eh non :-) Le fait d'utiliser l'interface graphique swing (ou plutôt awt) crée un fil d'exécution (un Thread) AWTEventThread. Quand main se termine, ce fil qui n'est pas en mode daemon continue de s'exécuter donc l'application fonctionne encore.
Comment faire en sorte que ca supprime tout?
dispose() par exemple, ou fermer les fenêtres.
Merci
de rien
insitu.
Xavier Tarrago
Une fenêtre est un objet persistant tant qu'elle a des ressources du système de fenêtrage de l os associées (peer). Cela permet de créer des fenêtres qui ont leur propre comportement (listeners attachés) et qui vivent à l'écran sans qu'il soit besoin de garder des références sur elles. La méthode dispose() des fenêtres de haut niveau (JFrame, JDialog, ...) permet de désallouer les ressources graphiques de l'os et de rendre la fenêtre disponible pour le garbage collector. En pratique, j'ai remarqué que la finalisation n'intervient pas de suite comme si swing gardait une ou deux fenêtres en réserve pour les réutiliser.
Pour tester tout cela, - faire une fenetre dérivée de JFrame pour laquelle finalize() écrit un message sur System.err - setVisible(true) l'affiche - setVisible(false) + dispose + mettre la ou les référence à null Recommencer pour plusieurs fenetres...
"Alex" a écrit dans le message de news:446ce049$0$8126$
Il n'existe pas en java de mot clef "delete" comme en c/c++ pour supprimer une variable (vive le garbage collector qui gère tout).
Cependant je me heurte à un léger problème (qui vient sans doute de l'utilisation des swing)
Mon code simplifié est le suivant:
class Toto { private class Gui { Gui() { _frame = new JFrame(); ... _frame.setVisible(true); } private JFrame _frame; }
Toto() { _gui = new Gui(); } private Gui _gui;
static void test() { Toto toto = new Toto(); }
static void main() { test(); test(); } }
Quand j'execute ce code, j'obtiens l'affichage de 2 fenetres. Or quand la fonction test() se termine, la variable toto de cette fonction n'est plus utilisée, et devrait donc être supprimée, et donc aussi l'interface graphique et tout. Mais non!!!
Comment faire en sorte que ca supprime tout? J'ai essayé de metrte toto = null; juste avant de sortir de la fonction test(), mais ca n'y change rien.
Merci
-- Alex
Une fenêtre est un objet persistant tant qu'elle a des ressources du
système de fenêtrage de l os associées (peer). Cela permet de créer des
fenêtres qui ont leur propre comportement (listeners attachés) et qui vivent
à l'écran sans qu'il soit besoin de garder des références sur elles. La
méthode dispose() des fenêtres de haut niveau (JFrame, JDialog, ...) permet
de désallouer les ressources graphiques de l'os et de rendre la fenêtre
disponible pour le garbage collector. En pratique, j'ai remarqué que la
finalisation n'intervient pas de suite comme si swing gardait une ou deux
fenêtres en réserve pour les réutiliser.
Pour tester tout cela,
- faire une fenetre dérivée de JFrame pour laquelle finalize() écrit un
message sur System.err
- setVisible(true) l'affiche
- setVisible(false) + dispose + mettre la ou les référence à null
Recommencer pour plusieurs fenetres...
"Alex" <compuhelp@free.fr> a écrit dans le message de
news:446ce049$0$8126$626a54ce@news.free.fr...
Il n'existe pas en java de mot clef "delete" comme en c/c++ pour
supprimer une variable (vive le garbage collector qui gère tout).
Cependant je me heurte à un léger problème (qui vient sans doute de
l'utilisation des swing)
Mon code simplifié est le suivant:
class Toto {
private class Gui {
Gui() {
_frame = new JFrame();
...
_frame.setVisible(true);
}
private JFrame _frame;
}
Toto() {
_gui = new Gui();
}
private Gui _gui;
static void test() {
Toto toto = new Toto();
}
static void main() {
test();
test();
}
}
Quand j'execute ce code, j'obtiens l'affichage de 2 fenetres.
Or quand la fonction test() se termine, la variable toto de cette
fonction n'est plus utilisée, et devrait donc être supprimée, et donc
aussi l'interface graphique et tout.
Mais non!!!
Comment faire en sorte que ca supprime tout?
J'ai essayé de metrte toto = null; juste avant de sortir de la fonction
test(), mais ca n'y change rien.
Une fenêtre est un objet persistant tant qu'elle a des ressources du système de fenêtrage de l os associées (peer). Cela permet de créer des fenêtres qui ont leur propre comportement (listeners attachés) et qui vivent à l'écran sans qu'il soit besoin de garder des références sur elles. La méthode dispose() des fenêtres de haut niveau (JFrame, JDialog, ...) permet de désallouer les ressources graphiques de l'os et de rendre la fenêtre disponible pour le garbage collector. En pratique, j'ai remarqué que la finalisation n'intervient pas de suite comme si swing gardait une ou deux fenêtres en réserve pour les réutiliser.
Pour tester tout cela, - faire une fenetre dérivée de JFrame pour laquelle finalize() écrit un message sur System.err - setVisible(true) l'affiche - setVisible(false) + dispose + mettre la ou les référence à null Recommencer pour plusieurs fenetres...
"Alex" a écrit dans le message de news:446ce049$0$8126$
Il n'existe pas en java de mot clef "delete" comme en c/c++ pour supprimer une variable (vive le garbage collector qui gère tout).
Cependant je me heurte à un léger problème (qui vient sans doute de l'utilisation des swing)
Mon code simplifié est le suivant:
class Toto { private class Gui { Gui() { _frame = new JFrame(); ... _frame.setVisible(true); } private JFrame _frame; }
Toto() { _gui = new Gui(); } private Gui _gui;
static void test() { Toto toto = new Toto(); }
static void main() { test(); test(); } }
Quand j'execute ce code, j'obtiens l'affichage de 2 fenetres. Or quand la fonction test() se termine, la variable toto de cette fonction n'est plus utilisée, et devrait donc être supprimée, et donc aussi l'interface graphique et tout. Mais non!!!
Comment faire en sorte que ca supprime tout? J'ai essayé de metrte toto = null; juste avant de sortir de la fonction test(), mais ca n'y change rien.
Merci
-- Alex
TestMan
Bonjour,
Pour compléter l'explication de Xavier, tu peux aller sur : http://java.sun.com/j2se/1.5.0/docs/api/java/awt/doc-files/AWTThreadIssues.html
A+
TM
Il n'existe pas en java de mot clef "delete" comme en c/c++ pour supprimer une variable (vive le garbage collector qui gère tout).
Cependant je me heurte à un léger problème (qui vient sans doute de l'utilisation des swing)
Mon code simplifié est le suivant:
class Toto { private class Gui { Gui() { _frame = new JFrame(); ... _frame.setVisible(true); } private JFrame _frame; }
Toto() { _gui = new Gui(); } private Gui _gui;
static void test() { Toto toto = new Toto(); }
static void main() { test(); test(); } }
Quand j'execute ce code, j'obtiens l'affichage de 2 fenetres. Or quand la fonction test() se termine, la variable toto de cette fonction n'est plus utilisée, et devrait donc être supprimée, et donc aussi l'interface graphique et tout. Mais non!!!
Comment faire en sorte que ca supprime tout? J'ai essayé de metrte toto = null; juste avant de sortir de la fonction test(), mais ca n'y change rien.
Merci
Bonjour,
Pour compléter l'explication de Xavier, tu peux aller sur :
http://java.sun.com/j2se/1.5.0/docs/api/java/awt/doc-files/AWTThreadIssues.html
A+
TM
Il n'existe pas en java de mot clef "delete" comme en c/c++ pour
supprimer une variable (vive le garbage collector qui gère tout).
Cependant je me heurte à un léger problème (qui vient sans doute de
l'utilisation des swing)
Mon code simplifié est le suivant:
class Toto {
private class Gui {
Gui() {
_frame = new JFrame();
...
_frame.setVisible(true);
}
private JFrame _frame;
}
Toto() {
_gui = new Gui();
}
private Gui _gui;
static void test() {
Toto toto = new Toto();
}
static void main() {
test();
test();
}
}
Quand j'execute ce code, j'obtiens l'affichage de 2 fenetres.
Or quand la fonction test() se termine, la variable toto de cette
fonction n'est plus utilisée, et devrait donc être supprimée, et donc
aussi l'interface graphique et tout.
Mais non!!!
Comment faire en sorte que ca supprime tout?
J'ai essayé de metrte toto = null; juste avant de sortir de la fonction
test(), mais ca n'y change rien.
Pour compléter l'explication de Xavier, tu peux aller sur : http://java.sun.com/j2se/1.5.0/docs/api/java/awt/doc-files/AWTThreadIssues.html
A+
TM
Il n'existe pas en java de mot clef "delete" comme en c/c++ pour supprimer une variable (vive le garbage collector qui gère tout).
Cependant je me heurte à un léger problème (qui vient sans doute de l'utilisation des swing)
Mon code simplifié est le suivant:
class Toto { private class Gui { Gui() { _frame = new JFrame(); ... _frame.setVisible(true); } private JFrame _frame; }
Toto() { _gui = new Gui(); } private Gui _gui;
static void test() { Toto toto = new Toto(); }
static void main() { test(); test(); } }
Quand j'execute ce code, j'obtiens l'affichage de 2 fenetres. Or quand la fonction test() se termine, la variable toto de cette fonction n'est plus utilisée, et devrait donc être supprimée, et donc aussi l'interface graphique et tout. Mais non!!!
Comment faire en sorte que ca supprime tout? J'ai essayé de metrte toto = null; juste avant de sortir de la fonction test(), mais ca n'y change rien.
Merci
said.rabie
je rajoute un petit truc :)
private class Gui { Gui() { _frame = new JFrame(); ... _frame.setVisible(true); } private JFrame _frame; } .....
pourquoi private JFrame frame; pourquoi stoké la frame comme champs de la class
la metre en variable local sufirai bien en plus le chargement des champs est un peu long donc :
private class Gui { Gui() { final JFrame _frame = new JFrame(); // final pour plus de rapiditer ... _frame.setVisible(true); }
}
je rajoute un petit truc :)
private class Gui {
Gui() {
_frame = new JFrame();
...
_frame.setVisible(true);
}
private JFrame _frame;
}
.....
pourquoi private JFrame frame;
pourquoi stoké la frame comme champs de la class
la metre en variable local sufirai bien en plus le chargement des
champs est un peu long
donc :
private class Gui {
Gui() {
final JFrame _frame = new JFrame(); // final pour plus de
rapiditer
...
_frame.setVisible(true);
}