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 :

[JDIC] Problème à la fermeture d'un WebBrowser


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 7
    Par défaut [JDIC] Problème à la fermeture d'un WebBrowser
    Salut,

    Voilà le problème : J'affiche un browser (JDIC) intégré à un JPanel ou à une JFrame, peu importe. Jusqu'ici, tout va bien, la page html s'affiche bien, etc.

    Seulement, tout se complique à la fermeture de la Frame ou de l'appli contenant le panel ! Il semble que le browser ne se ferme pas bien... En effet, lorsque je lance l'appli depuis Eclipse, après avoir fermé la frame, le fameux bouton "Terminate" de la console reste disponible, signe que tout ne se passe pas correctement...

    Voici un petit bout de code à tester pour se rendre compte du problème :
    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
    import java.net.MalformedURLException;
    import java.net.URL;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    import org.apache.log4j.Logger;
    import org.jdesktop.jdic.browser.BrowserEngineManager;
    import org.jdesktop.jdic.browser.IBrowserEngine;
    import org.jdesktop.jdic.browser.WebBrowser;
     
    import ch.elca.leaf.base.Version;
     
    import com.jgoodies.forms.builder.PanelBuilder;
    import com.jgoodies.forms.layout.FormLayout;
     
    public class Browser {
     
    	/** Version revision of this class. */
    	public static final Version IMPL_VERSION = new Version("$Revision$");
     
    	/** The Logger */
    	private static Logger s_logger = Logger.getLogger(Browser.class);
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Browser");
    		frame.setVisible(true);
    		frame.setSize(800, 600);
     
    		BrowserEngineManager bem = BrowserEngineManager.instance();
     
    		IBrowserEngine be = bem.getActiveEngine();
    		if (be == null) {
    			bem.setActiveEngine(BrowserEngineManager.IE);
    		}
     
    		JPanel m_browserPanel = null;
    		try {
    			WebBrowser.setDebug(true);
    			WebBrowser browser = new WebBrowser(new URL("http://www.google.com"), true);
    			browser.setName("Browser");
     
    			FormLayout layout = new FormLayout("fill:1dlu:grow", "fill:1dlu:grow");
    			PanelBuilder builder = new PanelBuilder(layout);
    			builder.add(browser);
    			m_browserPanel = builder.getPanel();
    		} catch (MalformedURLException e) {
    			s_logger.fatal(e.getMessage(), e);
    		}
     
    		frame.add(m_browserPanel);
    		frame.validate();
    	}
    }
    Ici, j'ajoute le browser à un panel, puis le panel à une frame, pour reproduire les conditions de mon appli. Le passage par un FormLayout permet d'éviter les problèmes de redimensionnement dus au conflit AWT/SWING.

    Dans mon cas, la ligne suivante est inenvisageable :
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    Si quelqu'un a une idée, n'hésitez pas !
    Merci d'avance !

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Citation Envoyé par Elatan Voir le message
    Dans mon cas, la ligne suivante est inenvisageable :
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Pourquoi ?

    Et si c'est vraiment le cas tu devras mettre en place un mécanisme de fermeture de l'application...

    a++

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 7
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,
    Pourquoi ?

    Et si c'est vraiment le cas tu devras mettre en place un mécanisme de fermeture de l'application...

    a++
    Parce que cette instruction ferme le JVM, et c'est pas du tout ce que je veux. J'en ai besoin pour le reste de l'appli. J'aimerais qu'elle reste ouverte, mais qu'il ne reste rien du browser en mémoire, qu'à la fermeture de la frame, le browser disparaisse entièrement !

    J'ai un mécanisme de fermeture de mon appli, avec notamment une méthode doClose() dans laquelle je mets ce que je veux... Et je cherche justement ici les instructions adéquates pour libérer le browser entièrement.

    Merci de ta remarque !

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Dans ce cas il suffit de faire un dispose() sur la fenêtre ou tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    Cela libèrera la fenêtre et ses composants...



    Quand au bouton "Terminate" c'est tout à fait normal qu'il reste actif si la JVM tourne toujours puisqu'il sert justement à tuer le process de la JVM...

    a++

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 7
    Par défaut
    Merci de ta réponse !

    Alors, le DISPOSE_ON_CLOSE est déjà ce qui est mis en place dans mon appli. En effet, j'ai oublié de le mettre dans l'exemple de code que j'ai fourni, mea culpa, mais quand on le rajoute, le problème demeure.

    J'ai ajouté browser.dispose() dans ma méthode doClose(), mais ca ne change pas le problème malheureusment.

    En théorie, lorsque toutes les frames de l'appli ont des DISPOSE_ON_CLOSE comme mode de fermeture, et que tout se passe bien, la JVM se ferme normalement lors de la fermeture de la dernière frame.
    Mon problème est donc le suivant : lorsqu'il y a un WebBrowser dans une des frames de l'appli, la JVM ne se ferme pas correctement à la fin... Et j'aimerais savoir si quelqu'un sait pourquoi, et comment résoudre le problème !

    Merci de votre aide !

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Elatan Voir le message
    En théorie, lorsque toutes les frames de l'appli ont des DISPOSE_ON_CLOSE comme mode de fermeture, et que tout se passe bien, la JVM se ferme normalement lors de la fermeture de la dernière frame.
    Non : dispose() ne fait que libérer les ressources systèmes associé à la fenêtre et à ses sous-composants...

    Ce n'est pas lié au WebBrowser ou à un autre composant...

    Si tu n'utilises pas EXIT_ON_CLOSE tu dois mettre en place un mécanisme pour faire un System.exit() (ou autre) lors de la fermeture de la dernière fenêtre, car sinon le thread de l'EDT continuera à tourner !

    Bref regarde du coté des WindowListeners...

    a++

    PS : Comme cela n'a rien à voir avec l'API JDIC je déplace le sujet dans AWT/Swing...

  7. #7
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Hello adiGuba,

    Pour expliquer Elatan est stagiaire chez nous

    On n'utilise jamais System.exit() dans notre code (sauf pour les batchs si on désire indiquer une valeur de retour). Même pas pour fermer l'application. Il n'y a aucun problème d'avoir des dispose partout car la JVM se ferme bien une fois toutes les frames disposées (si elles restituent correctement les ressources, ce que nous pouvons justement bien tester en s'affranchissant d'un appel à System.exit()).

    Tu penses que ce n'est pas bien ?

    Toujours est-il que ce WebBrowser est récalcitrant à la fermeture. Mais si personne n'a de soluce je serais sûrement obligé d'investiguer avec un profiler pour mieux comprendre ce qu'il se passe.

    ++

  8. #8
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par natha Voir le message
    Il n'y a aucun problème d'avoir des dispose partout car la JVM se ferme bien une fois toutes les frames disposées
    Je n'ai rien contre les dipose() au contraire mais il me semblait que cela n'arrêtait pas l'EDT et que donc la JVM continuait à fonctionner même après la fermeture de la dernière fenêtre...

    Il faut dire que perso j'abuse du EXIT_ON_CLOSE


    Citation Envoyé par natha Voir le message
    Toujours est-il que ce WebBrowser est récalcitrant à la fermeture. Mais si personne n'a de soluce je serais sûrement obligé d'investiguer avec un profiler pour mieux comprendre ce qu'il se passe.
    Peut-être qu'il existe d'autres thread récalcitrant... Utilises Thread.enumerate() pour les lister et voir s'il n'y a pas de thread non-daemon qui tournerait toujours...

    a++

  9. #9
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Je n'ai rien contre les dipose() au contraire mais il me semblait que cela n'arrêtait pas l'EDT et que donc la JVM continuait à fonctionner même après la fermeture de la dernière fenêtre...

    Il faut dire que perso j'abuse du EXIT_ON_CLOSE
    Il suffit de faire un test rapide pour se convaincre que le dispose arrête bien l'EDT.

    Crées une simple JFrame en DISPOSE_CLOSE, affiches là et fermes là, puis regarde si ton process java tourne encore.

    Dans le cas présent il y a forcément un Thread qui ne s'est pas arrêté, et il suffirati de profiler ou de passer l'appli au débugger pour trouver le fautif (ou au pire par un Thread.enumerate comme tu le conseilles

  10. #10
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sinok Voir le message
    Il suffit de faire un test rapide pour se convaincre que le dispose arrête bien l'EDT.
    Oui c'est bien ce que j'ai fait (je suis comme St Thomas, je ne crois que ce que je vois ), mais je ne sais pas pourquoi j'étais persuadé du contraire...


    a++

Discussions similaires

  1. [MFC] CSocket ... problème à la fermeture
    Par Yellowmat dans le forum MFC
    Réponses: 7
    Dernier message: 29/04/2005, 15h37
  2. [TQuery] problème de fermeture
    Par mammistegon dans le forum Bases de données
    Réponses: 5
    Dernier message: 29/01/2005, 18h15
  3. [Thread][socket]Problème de fermeture d'un thread
    Par meda dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 04/11/2004, 01h03
  4. Problème de fermeture de l'application
    Par SkyDev dans le forum Langage
    Réponses: 2
    Dernier message: 16/06/2004, 02h06
  5. Problème de fermeture de balise <tr>
    Par nuage dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 18/03/2004, 09h55

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