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 :

détecter la fermeture de la fenêtre


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 147
    Par défaut détecter la fermeture de la fenêtre
    Salut,

    voici un extrait du code d'une petite application où Scenario est un JFrame :

    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
    23
    24
    25
    26
    27
    28
     
    	private boolean doIt() {
     
     		if (this.file==null) this.file = new File(System.getProperty("user.dir")) ;
    		if (this.scenario == null) {
    			this.file = selectFile() ;
    			if (this.file==null) return false ;
    			final String text = readFile(this.file) ;
    			if (text == null) return true ;
    			try { SwingUtilities. invokeLater(new Runnable(){
    				public void run(){
    					James.this.scenario = new Scenario(James.this, James.this.file, text) ;
    					}
    				}) ; }
    			catch (Exception e) { e.printStackTrace(); }
    			}
    		try {Thread.sleep(1000);} catch (InterruptedException e) {}
    		return true ;
    		}
     
    	/*
    	main
    	*/
     
    	public static void main(String params[]) {
    		James james = new James() ;
    		while (james.doIt()) ;
    		}
    Ce que je voudrais, c'est que lorsque l'utilisateur ferme le scenario, la methode doIt() lui demande de choisir un autre fichier.
    Ce que j'ai fait ne marche pas, car l'appel à scenario.dispose() ne suffit pas à rendre scenario null.

    Comment dois-je faire pour informer le thread principal que la fenêtre scenario a été fermée par l'utilisateur ?

  2. #2
    Membre éclairé Avatar de Balbuzard
    Profil pro
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut
    Si je comprends bien, lors de la fermeture de ta fenêtre, tu veux qu'il y ait affichage d'une autre fenêtre pour que l'utilisateur continue de faire quelque chose.

    A ta place, je ferais étendre ma classe de WindowListener. Cette interface propose une méthode windowClosed.

    va ici si tu veux voir l'api java

    lorsque ta fenêtre est fermée, la méthode windowClosed s'exécute, et en la surchargeant, tu peux demander à ce qu'une autre fenêtre s'ouvre.

    Enfin, pour fermer une fenêtre, j'utilise plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maFenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    qui marche mieux

    Voilà, j'espère t'avoir aidé :-)

  3. #3
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Citation Envoyé par sepas Voir le message
    l'appel à scenario.dispose() ne suffit pas à rendre scenario null.
    Un dispose() est fait pour détruire une fenêtre, pas pour rendre ton objet null.

    Pour maFenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ce n'est peut-être pas ce que tu cherche car cela fermera complètement ton application.

    Je suis assez d'accord avec le WindowListener.

    Voici un exemple qui peut-être t'aidera :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    import java.awt.Dialog.ModalityType;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
     
    @SuppressWarnings("serial")
    public class Test extends JFrame implements ActionListener, WindowListener {
     
    	private JButton btn = new JButton("Choose a file");
    	private JDialog chooser = new JDialog();
     
    	public static void main(String[] args) {
    		new Test();
    	}
     
    	public Test() {
    		chooser.setModalityType(ModalityType.APPLICATION_MODAL);
    		chooser.add(new JLabel("Simulation du choix d'un fichier"));
    		chooser.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    		chooser.addWindowListener(this);
    		btn.addActionListener(this);
     
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		add(btn);
    		pack();
    		setLocationRelativeTo(null);
    		setVisible(true);
    	}
     
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		chooser.pack();
    		chooser.setLocationRelativeTo(this);
    		chooser.setVisible(true);
    	}
     
    	@Override
    	public void windowActivated(WindowEvent e) { }
     
    	@Override
    	public void windowClosed(WindowEvent e) {
     
    	}
     
    	@Override
    	public void windowClosing(WindowEvent e) {
    		JOptionPane.showMessageDialog(this, 
    		         "Choix d'un autre fichier",
    		         "Avertissement",
    		         JOptionPane.WARNING_MESSAGE);
    	}
     
    	@Override
    	public void windowDeactivated(WindowEvent e) { }
     
    	@Override
    	public void windowDeiconified(WindowEvent e) { }
     
    	@Override
    	public void windowIconified(WindowEvent e) { }
     
    	@Override
    	public void windowOpened(WindowEvent e) { }
     
    }

  4. #4
    Membre éclairé Avatar de Balbuzard
    Profil pro
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut
    En effet, si tu as deux fenêtres et que si l'une d'elles tu exécutes la méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    maFenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    alors, toute ton application se fermera. Il faut que tu vérifies combien il reste de JFrame ouverte et si il n'y en plus qu'une seule, l'exécuter, sinon, faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    maFenetre.dispose();
    :-)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 147
    Par défaut
    Bon, regardez comment je m'en sors avec un windowListener.
    Lorsque la fenetre scenario est fermée, elle le signale au thread principal :

    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
    23
    24
    25
     
    	private void addListeners() {
    		addWindowListener(new WindowAdapter() { 
    			public void windowClosing(WindowEvent e) {
    				if (Scenario.this.text.equals(Scenario.this.textArea.getText())) close() ;
    				else {
    					int rep = JOptionPane.showConfirmDialog(Scenario.this, "Save changes before closing ?", "Scenario modified", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE) ;
    					switch(rep) {
    						case JOptionPane.YES_OPTION :
    							saveScenario(Scenario.this.file) ;
    						case JOptionPane.NO_OPTION :
    							close() ;
    						case JOptionPane.CANCEL_OPTION :
    							break ; 
    						}
    					}
    				}
    			});
    		}
     
    	private void close() {
    		setVisible(false) ;
    		dispose() ;
    		Scenario.this.parent.scenarioClosed() ;
    		}
    Lorsque le thread principal constate la fermeture du scenario, il propose l'ouverture d'un autre.
    Si l'utilisateur abandonne, alors l'application quitte.

    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
    23
    24
    25
    26
    27
    28
    29
    30
     
    	public void scenarioClosed() {
    		this.scenarioOpen = false ;
    		}
     
    	private boolean doIt() {
     
     		if (this.file==null) this.file = new File(System.getProperty("user.dir")) ;
    		if (!this.scenarioOpen) {
    			this.file = selectFile() ;
    			if (this.file==null) return false ;
    			final String text = readFile(this.file) ;
    			if (text == null) return true ;
    			SwingUtilities.invokeLater(new Runnable(){
    				public void run(){
    					James.this.scenario = new Scenario(James.this, James.this.file, text) ;
    					James.this.scenarioOpen = true ;
    					}
    				}) ;
    			}
    		try {Thread.sleep(1000);} catch (InterruptedException e) {}
    		return true ;
    		}
     
    	public static void main(String params[]) {
    		James james = new James() ;
    		while (james.doIt()) ;
    		}
     
    	}
    Ca marche, mais est-ce qu'il n'y a pas un inconvénient que je n'aurais pas vu à s'y prendre comme ça, en particulier du point de vue des threads ?

Discussions similaires

  1. Comment détecter la fermeture d'une fenêtre par la croix?
    Par man_coef dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/06/2008, 16h34
  2. Comment détecter la fermeture d'une fenêtre?
    Par Masmeta dans le forum C++Builder
    Réponses: 1
    Dernier message: 18/01/2007, 16h02
  3. Fermeture d'une fenêtre .dos
    Par VirginieGE dans le forum Windows
    Réponses: 2
    Dernier message: 03/06/2005, 13h56
  4. executer une fonction à la fermeture d'une fenêtre
    Par Oluha dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 22/02/2005, 09h46
  5. Arrêter un ttmt en cours, lors de la fermeture d'une fenêtre
    Par teska dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/12/2004, 14h08

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