IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Une fenêtre fermée prend-t-elle la valeur null?


Sujet :

AWT/Swing Java

  1. #1
    Membre habitué

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    178
    Points
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 178
    Points : 169
    Par défaut Une fenêtre fermée prend-t-elle la valeur null?
    je suis en train de construire une petite application qui permet de répondre à des questions dans un domaine technique.

    Ma fenêtre principale est une JFrame, que je souhaite détruire lorsque je clique sur la croix.
    Par défaut, dans la java doc, il est indiqué que, par défaut, c'est le "hide on close" qui est postionné sur la propriété "DefaultOperationOnClose".
    Cela veut dire que, si je ferme ma JFrame, en fait, elle existe toujours, et donc, elle est cachée mais pas détruite...

    Je souhaite donc positionner cette propriété sur "Dispose_On_Close", qui semble fermer libérer les ressources utilisées.

    1/ Si je créé une JFrame, il semble impossible de modifier après sa construction, cette propriété pour lui affecter "Dispose_On_Close", cela ne semble possible que lors de la construction de cette JFame.
    Est-ce bien le cas?

    2/ J'ai résolu ce premier problème en créant une classe qui étend JFrame, et positionne cette propriété comme désiré, sur "Dispose_On_close".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    package quizz;
     
    import javax.swing.JFrame;
     
    class Fenetre extends JFrame {
     
    	public Fenetre(String title) {
    		this.setTitle(title);
    		this.setSize(800, 800);
    		this.setVisible(true);
    		this.setAlwaysOnTop(true);
    		this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
    	}
     
    }
    Si je si crée un objet de la classe Fenetre, "fenetre1", le test "fenetre1!= null" donne true, normal, car ma fenêtre existe...
    Si je ferme mon objet "fenetre1", le test "fenetre1 != null" semble indiquer encore "true".
    La fenêtre, créée ou détruite semble toujours valoir "true"?? Mon raisonnement est-il faux??

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 890
    Points
    22 979
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 890
    Points : 22 979
    Billets dans le blog
    53
    Par défaut
    1/ cette valeur peut être modifiée n'importe quand, et si ce n’était pas le cas, ca serait spécifié dans la doc ; or cette dernière ne mentionne pas de blocage ou de restriction a ce niveau :

    Par exemple, si on ferme la fenêtre moins de 10s après son apparition, le programme ne se termine pas. Tandis que si on ferme la fenêtre plus 10s après son apparition, le programme se termine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public final class Main {
        public static void main(final String... args) {
            final var jFrame = new JFrame("Test");
            jFrame.setSize(800, 600);
            jFrame.setVisible(true);
            new Timer(10000, event -> {
                jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            }).start();
        }
    }
    2/ tu ne nous as pas montré le code qui te posait des soucis.

    Je tiens juste a préciser que le comportement de DISPOSE_ON_CLOSE est que si la dernière fenêtre a l’écran a été fermée, alors le programme s’arrêtera.
    De plus, la doc de DISPOSE_ON_CLOSE renvoie vers Window.dispose() qui indique que :

    Citation Envoyé par javadoc
    Releases all of the native screen resources used by this Window, its subcomponents, and all of its owned children. That is, the resources for these Components will be destroyed, any memory they consume will be returned to the OS, and they will be marked as undisplayable.

    The Window and its subcomponents can be made displayable again by rebuilding the native resources with a subsequent call to pack or show. The states of the recreated Window and its subcomponents will be identical to the states of these objects at the point where the Window was disposed (not accounting for additional modifications between those actions).

    Note: When the last displayable window within the Java virtual machine (VM) is disposed of, the VM may terminate. See AWT Threading Issues for more information.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre habitué

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    178
    Points
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 178
    Points : 169
    Par défaut defaultOperationOnClose
    Il y a un petit truc qui m'échappe..

    Je fais un petit programme pour créer deux JFrames, de manières différentes :
    Nom : deux fenetres.png
Affichages : 53
Taille : 9,3 Ko

    Pour la première, je créé une classe "Fenetre, qui étend simplement JFrame, et dans son constructeur, je positionne le "defaultOpérationOnClose" sur "Dispose_On_Close", sans rien changer par rapport à une JFrame de base.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    public class Fenetre extends JFrame {
     
     
     
     
     
    	public Fenetre() {
    				this.setTitle("fenetre1 extends JFrame");
    				this.isAlwaysOnTop();		
    				this.setSize(500,500);
    				this.setLocation(0,0);
    				this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    				this.setVisible(true);
    				JPanel contentPane = new JPanel();
    				this.setContentPane(contentPane);			
    	};
     
     
    }


    Pour la seconde, je prends la classe pré-définie, "JFrame" que j'utilise directement.
    Je créé une instance que j'appelle "mafenetre2", en lui affectant les même propriétés que "mafenetre1".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    public class MainJFrame1 {
     
    	public static void main(String[] args) {
     
    		Fenetre mafenetre1 = new Fenetre();
     
    		JFrame mafenetre2 = new JFrame();
    		mafenetre2.setTitle("mafenetre2 JFrame simple");
    		mafenetre2.isAlwaysOnTop();		
    		mafenetre2.setSize(500, 500);
    		mafenetre2.setLocation(550,0);
    //		mafenetre2.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    		mafenetre2.setVisible(true);
    		JPanel contentPane = new JPanel();
    		mafenetre2.setContentPane(contentPane);	
    	}
     
    }
    Tout cela fonctionne mais UNIQUEMENT si je ne modifie pas le "disposeOnCloseOpération" de la JFrame de base "mafenetre2".
    J'ai donc l'impression que l'on ne peut pas modifier cette propriété, après la construction de l'objet...
    Je me trompe où??

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 890
    Points
    22 979
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 890
    Points : 22 979
    Billets dans le blog
    53
    Par défaut
    Ce code s’exécute pour moi sans aucune erreur (avec ou sans le contenu de la ligne commentée).

    Quelle est l'erreur qui survient dans ton cas ? Quelle version de Java ? Quel OS ?
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre habitué

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    178
    Points
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 178
    Points : 169
    Par défaut ma version
    Je ne sais pas résoudre le problème, peut-être que c'est évident, mais je ne vois pas....

    Mon windows sur un pc "un peu vieux":
    Nom : widowsVersion.png
Affichages : 39
Taille : 5,3 Ko

    mon ide éclipse :
    Nom : ideVersion.png
Affichages : 38
Taille : 46,4 Ko

    mon message d'erreur éclipse :
    Nom : msgErreur.png
Affichages : 38
Taille : 26,1 Ko

    A suivre....

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 890
    Points
    22 979
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 890
    Points : 22 979
    Billets dans le blog
    53
    Par défaut
    DISPOSE_ON_CLOSE est une constante définie statiquement dans l'interface WindowConstants (qui est implementée par JFrame).
    Tu as donc plusieurs moyens de référencer cette valeur, parmi les plus courants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import javax.swing.JFrame;
     
     
    mafenetre2.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import javax.swing.JFrame;
    import static javax.swing.JFrame.DISPOSE_ON_CLOSE;
     
     
    mafenetre2.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import javax.swing.JFrame;
    import static javax.swing.JFrame.*;
     
     
    mafenetre2.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    Donc, de manière générale, tu as juste oublié d'écrire le qualificateur qui permet de résoudre le chemin de la variable dans ton code. Et, évidement, tout fonctionnait sans soucis dans une classe qui étend JFrame puisque, du coup, tu as directement accès a toutes les constantes heritées de cette classe.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  7. #7
    Membre habitué

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    178
    Points
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 178
    Points : 169
    Par défaut Merci Bouye
    Effectivement, les différentes propositions permettent de supprimer le message d'erreur et tout fonctionne bien.

    Il y a des notions qui m'échappent encore et des problématiques qui restent hors de ma portée, mais je suis satisfait d'avoir une réponse aussi claire dans des notions aussi subtiles pour moi.

    Merci pour la réactivité et la précision des réponses.

  8. #8
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 890
    Points
    22 979
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 890
    Points : 22 979
    Billets dans le blog
    53
    Par défaut
    En Java (mais aussi en C++, C# et d'autres languages), une entité (package, classe, variable) porte un nom unique qui est son nom long (ou encore chemin d’accès) qui est généralement défini par un enchaînement de packages (ou espace de nommage) et de classes contenant l’entité (rappel qu'on peut mettre des classes dans des classes). Ex : javax.swing.JFrame : package javax, package swing, classe JFrame.
    Ceci permet par exemple d'avoir plusieurs entités différentes avec le meme nom court (java.util.Date, java.sql.Date, ou encore java.awt.Color, javafx.scene.paint.Color). Car de nos jours les API sont tellement énormes que, oui, il y aura forcement des collisions entre les noms courts (plusieurs entités portant le meme nom court).

    Si tu utilises JFrame dans ton code, il faudrait en théorie écrire partout javax.swing.JFrame pour pouvoir l'utiliser. Idem pour n'importe quelle autres classes ou constante. C'est évidement peu pratique.
    Donc a la place tu peux écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import javax.swing.JFrame
     
    JFrame toto = ...
    Cet import ne fait pas une inclusion du contenu de JFrame dans ton code (c'est pas un #include comme en C/C++). Cet import, qui est similaire a la directive using namespace <nom de l'espace de nomange> dans d'autres languages (C++/C#), est juste une syntaxe qui permet au compilateur de résoudre facilement le nom complet de JFrame au moment de la compilation. Et donc de remplacer JFrame par javax.swing.JFrame partout dans ton code durant la compilation.

    D'ailleurs si tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import java.util.Date;
    import java.sql.Date;
     
    Date date = ...
    Ce meme compilateur va se plaindre car il sait pas du tout laquelle des 2 classes Date il doit utiliser. Du coup on va devoir écrire le code comme suit pour distinguer entre les 2 classes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import java.util.Date; // Pour toutes les dates basiques on peut desormais ecrire juste "Date"
     
    Date date = ...
    java.sql.Date sqlDate = ... // Par contre pour les dates SQL il faut bien ecrire le nom complet pour faire la distinction.
    Prenons maintenant DISPOSE_ON_CLOSE. De part son heritage, la constante est accessible depuis la classe javax.swing.JFrame. Mais le fait d'avoir fait import javax.swing.JFrame ne permet pas pour autant au compilateur de découvrir le nom complet permettant d’accéder a cette constance. C'est pour cela qu'il faut écrire JFrame.DISPOSE_ON_CLOSE. En effet, le nom complet de la constance permettant d'y accéder est javax.swing.JFrame.DISPOSE_ON_CLOSE et on sait déjà comment résoudre le nom complet de JFrame.

    Quand tu fais import static javax.swing.JFrame.DISPOSE_ON_CLOSE alors on dit spécifiquement au compilateur qu'on essaie d’accéder une constante ou une méthode statique (et publique) de la classe JFrame. Du coup, oui, il pourra tenter de remplacer DISPOSE_ON_CLOSE par javax.swing.JFrame.DISPOSE_ON_CLOSE partout dans ton code au moment de la compilation.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  9. #9
    Membre habitué

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    178
    Points
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 178
    Points : 169
    Par défaut Encore merci.
    Merci pour ces précisions.

    Il faut avoir le recul nécessaire pour bien appréhender la source du problème.
    Merci pour ta clarté et ta pédagogie.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/05/2012, 22h33
  2. Exporer des valeurs dans une fichier fermé.
    Par guigui1976 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 12/02/2011, 09h31
  3. une fentre qui s'affiche et qui se ferme
    Par elmcherqui dans le forum Qt
    Réponses: 1
    Dernier message: 01/07/2008, 09h14
  4. Réponses: 1
    Dernier message: 14/06/2007, 21h00
  5. Réponses: 8
    Dernier message: 30/11/2005, 11h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo