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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    178
    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
    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 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 909
    Billets dans le blog
    54
    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 confirmé

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    178
    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
    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 : 81
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 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 909
    Billets dans le blog
    54
    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 confirmé

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    178
    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
    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 : 67
Taille : 5,3 Ko

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

    mon message d'erreur éclipse :
    Nom : msgErreur.png
Affichages : 66
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 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 909
    Billets dans le blog
    54
    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

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/05/2012, 21h33
  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, 08h31
  3. une fentre qui s'affiche et qui se ferme
    Par elmcherqui dans le forum Qt
    Réponses: 1
    Dernier message: 01/07/2008, 08h14
  4. Réponses: 1
    Dernier message: 14/06/2007, 20h00
  5. Réponses: 8
    Dernier message: 30/11/2005, 10h00

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