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

Interfaces Graphiques en Java Discussion :

Fermeture Thread propre


Sujet :

Interfaces Graphiques en Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Fermeture Thread propre
    Bonjour,

    J'ai un programme depuis lequel je peux lancer une aide qui s'ouvre dans une deuxième fenêtre (un navigateur internet de l'api DJ NATIVE SWING).

    Mon soucis et que lorsque j'ouvre puis quitte cette aide, et que je re clique sur le bouton pour l'ouvrir de nouveau, un paquet d'erreur apparaît. Ca ne doit pas aimer que je start() le thread plusieurs fois je suppose.

    Voici les erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Exception in thread "AWT-EventQueue-0" java.lang.IllegalThreadStateException
        at java.lang.Thread.start(Thread.java:682)
        at fr.DAD.pdfSpliter.Interface.itemMenuDocumentationActionPerformed(Interface.java:275)
        at fr.DAD.pdfSpliter.Interface.access$600(Interface.java:22)
        at fr.DAD.pdfSpliter.Interface$9.actionPerformed(Interface.java:157)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
        at javax.swing.AbstractButton.doClick(AbstractButton.java:376)   
        (...)
    Voici ma classe qui s'occupe du navigateur :

    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
    public class Faq extends Thread{
     
        private JPanel panel;
        private final JWebBrowser webBrowser;
        CocDad tool = new CocDad();
     
      public Faq(){
     
        panel = new JPanel(new BorderLayout());
        JPanel webBrowserPanel = new JPanel(new BorderLayout());
        webBrowser = new JWebBrowser(JWebBrowser.destroyOnFinalization());
        webBrowser.navigate("file:///"+tool.log.getPathPdf()+"Faq/Manuel.html");
        webBrowser.setBarsVisible(false);
        webBrowser.setButtonBarVisible(false);
        webBrowser.setMenuBarVisible(false);
        webBrowserPanel.add(webBrowser, BorderLayout.CENTER);
        panel.add(webBrowserPanel, BorderLayout.CENTER);
        UIUtils.setPreferredLookAndFeel();
        NativeInterface.open();
     
      }
            @Override
          public void run() {
            JFrame frame = new JFrame("F.A.Q COC-PDF");
            frame.setLocation(10, 10);
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            frame.getContentPane().add(panel, BorderLayout.CENTER);
            frame.setSize(1050,900);
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
     
            if(!frame.isEnabled())
            {
                NativeInterface.close();
                Thread.currentThread().interrupt();
            }
          }
    }
    J'instancie depuis un Evénement sur un bouton d'une autre classe simplement par:

    faq.start();


    Voilà je pense que je ferme mal mon thread alors quand je re clique sur le bouton et que "faq.start()" est appelé de nouveau, ben ça coince.

    si quelqu'un avait une idée de comment faire.

    Je vous remercie d'avance pour vos éventuelles réponses

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Il suffisait de remplacer
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try{
                faq.start();
            }catch(IllegalThreadStateException i)
            {
                Faq faq = new Faq();
                faq.start();
            }

  3. #3
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 084
    Points : 7 998
    Points
    7 998
    Par défaut
    Euh je ne crois pas que ca, ca va résoudre quoi que ce soit, juste camoufler éventuellement le problème.

    Mais ca réponds quand même à la question, dans le sens ou on ne peux démarré un thread qu'une et une seule fois.

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur Java/Scala
    Inscrit en
    Octobre 2007
    Messages
    1 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Scala

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 086
    Points : 2 271
    Points
    2 271
    Par défaut
    En effet on ne peut pas démarrer un thread plusieurs fois.

    Une solution plus propre et plus proche de ce qui se fait dans la réalité est d'avoir une interface graphique gérée par un thread qui va déposer des évenements (clicks sur IHM etc) dans une queue.

    De l'autre coté de la queue tu as un pool de Thread qui va poller régulièrement la queue et effectuer les traitements.

    Ces Threads ne meurent jamais, tu peux mettre un while ( true ) dedans et catcher/logger les exception remontées, voir même envoyer une notification au Thread IHM pour afficher une erreur à l'utilisateur.

    Il me semble que c'est un peu de cette manière dont fonctionne Android par exemple et les clients lourds en général dont les actions IHM sont traitées de manière asynchrone (permet a l'utilisateur de cliquer sur plein de boutons en même temps)

    Tu peux aussi utiliser un ExecutorService pour déclencher tes traitements.

Discussions similaires

  1. [QThread] Fermeture propre d'un thread
    Par Invité dans le forum Multithreading
    Réponses: 3
    Dernier message: 11/04/2013, 15h06
  2. Fermeture thread BackgroundWoker
    Par richton95 dans le forum C#
    Réponses: 1
    Dernier message: 13/10/2012, 12h54
  3. [Threads] Fermeture threads non démons
    Par if_zen dans le forum Général Java
    Réponses: 1
    Dernier message: 07/01/2010, 17h22
  4. Probleme fermeture Thread
    Par Raton dans le forum MFC
    Réponses: 4
    Dernier message: 29/09/2005, 10h51
  5. [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, 02h03

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