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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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...

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