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

EDT/SwingWorker Java Discussion :

[appframework/jdesktop] Exécuter un background Task à la mano


Sujet :

EDT/SwingWorker Java

  1. #1
    Membre habitué
    Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Points : 156
    Points
    156
    Par défaut [appframework/jdesktop] Exécuter un background Task à la mano
    Salut,

    Comment je peux faire pour exécuter, à la mano, une tache en background ? (un object Task)

    En fait j'ai un bouton qui lance une task en background (nos fameux swingworkers), tout va bien, après le doInBackground(), le success() est appelé.
    A ce moment, je voudrais enchainer avec une autre Task en background, et je galère un peu.

    J'ai réussi à le faire avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getContext().getTaskService().execute(new GetContainerDetailsTask(getApplication()));
    mais... cette tache n'était pas liée au TaskMonitor, donc à ma barre de statut. Et je voudrais voir la progress bar et tout le tatouin en action ; pour y afficher des messages entre autre

    Faut-il attacher cette autre Task à l'ActionMap ? tout comme on le fait avec les composants swing et le setAction(actionMap.get("nomDeMaTache")) ?

    Merci bien pour votre aide !

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Comment as-tu créé ta status bar ? L'as-tu bien ajoutée en tant que PropertyChangeListener du TaskMonitor ?

  3. #3
    Membre habitué
    Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Points : 156
    Points
    156
    Par défaut
    Oui, j'ai repris le code généré par NetBeans :

    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
    /**
             * Connect action tasks to status bar via TaskMonitor.
             */
    	private void connectStatusBarToActions()
    	{
    		TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext());
     
            taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() 
            {
                public void propertyChange(java.beans.PropertyChangeEvent evt) 
                {
                    String propertyName = evt.getPropertyName();
                    if ("started".equals(propertyName)) 
                    {
                    	// if not already started, start busy icon animation
                        if (!busyIconTimer.isRunning()) 
                        {
                            statusAnimationLabel.setIcon(busyIcons[0]);
                            busyIconIndex = 0;
                            busyIconTimer.start();
                        } 
    ...
    Pour les autres taches exécutées par l'appfwk (via @Action), la status bar s'active bien.


    Je viens d'essayer de l'activer comme ça mais ça fonctionne pas non plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    getContainerDetails().execute();
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @Action
        public Task getContainerDetails()
        {
        	return new GetContainerDetailsTask(getApplication());
        }
    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
    /**
         * 
         * 
         * @author 
         */
        public class GetContainerDetailsTask extends Task<Object, Void>
        {
     
        	/**
                     * Constructor.
                     * @param app application
                     */
    		public GetContainerDetailsTask(Application app)
    		{
    			super(app);
     
    		}
     
    		/**
                     * @see org.jdesktop.swingworker.SwingWorker#doInBackground()
                     */
    		@Override
    		protected Object doInBackground() throws Exception
    		{
    			if(containersList != null && containersList.length > 0)
    			{
    				for (int i = 0; i < containersList.length; i++)
    				{
    					String containerNumber = containersList[i];
    					setMessage(resourceMap.getString("aci.containersDetailsAction.message", new Object[]{containerNumber}));
    					DoContainerDetail doContainerDetail = boContainerContent.getDetailsForContainer(containerNumber);
    					containersDetailsList.add(doContainerDetail);
     
    					LOGGER.debug("BG task running: " + resourceMap.getString("aci.containersDetailsAction.message", new Object[]{containerNumber}));
    				}
    			}
    			return null;
    		}
        }

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Je ne connais pas le code généré par Netbeans : j'utilise Eclipse.

    Tout d'abord, ne tente pas d'exécuter une Task avec la simple méthode execute de Task : elle ne sera jamais ajoutée au TaskMonitor de cette manière.

    Ensuite, n'exécute pas une serial task comme cela. Je ne sais pas comment cela doit être fait, mais au vu du code de l'appfw, cela risque de poser problème.

    Est-il envisageable d'exécuter une grosse tâche contenant toutes les tâches à exécuter en série, et de les exécuter dans le même thread ?

  5. #5
    Membre habitué
    Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Points : 156
    Points
    156
    Par défaut
    Ok, j'utilise Eclipse aussi, j'avais juste repris la partie taskMonitor de NB.

    Bon finalement, effectivement soit je mets toutes les 2 taches à la suite dans une seule "grande" tache, comme tu l'as proposé.

    Soit j'utilise ce morceau de code de mon invention qui n'est peut etre pas propre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        			Task e = new GetContainerDetailsTask(getApplication());
        			taskMonitor.setForegroundTask(e);
        			getContext().getTaskService().execute(e);
    N'empeche que visiblement, on ne peut pas utiliser le TaskMonitor de Jdesktop pour des threads "Task"/"SwingWorkers" qui ne sont pas activés avec l'action map du context de l'application. Comprendra qui comprend l'appfwk ;-)

    Merci pour ton aide dingoth
    J'en profite pour remonter ce topic qui n'a pas eu de réponse sur l'appfwk aussi (dés fois que tu saches) : http://www.developpez.net/forums/d84...ources-p-i18n/

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Si, on peut. D'ailleurs le code d'exécution d'une tâche d'une actionMap est rigoureusement identique à ce que tu as fait. D'où mes questions sur la Status Bar.


    Pour ton morceau de code, intervertis les lignes 2 et 3 : tu entres dans un cas indéfini en faisant comme tu le fais.

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

Discussions similaires

  1. Background Task sous Windows Phone 8
    Par Edtech dans le forum Windows Phone
    Réponses: 4
    Dernier message: 08/02/2013, 10h34
  2. [XL-2010] Excel continue de s'exécuter en background après la fin de la macro qui le contrôle.
    Par sunlover dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/04/2011, 15h05
  3. [SSIS] [2K8] Erreur exécution Execute SQL Task
    Par gassisprog dans le forum SSIS
    Réponses: 0
    Dernier message: 27/05/2010, 13h00
  4. [JSR-296;appframework] InputBlocker pour une Task
    Par Bapt.ice dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 19/03/2010, 11h32
  5. personnalisation d'un Background task
    Par SaiRictus dans le forum NetBeans
    Réponses: 1
    Dernier message: 29/07/2009, 12h00

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