Utilisation de SwingWorker

infaac
Utilisation de SwingWorker

Bonjour,

Lors d'une amélioration apportée à mon code de GUI, j'ai intégré la classe SwingWorker (téléchargée sur le site de SUN) mais dans la méthode construct j'ai fait des modifications sur des composants de la GUI :Tree, button, message ...

Est ce que ceci peut me créer des problémes côté affichage et performance de la GUI?

Merci
http://java.sun.com/products/jfc/tsc/articles/threads/src/SwingWorker.java

fredericmazue

Bonjour,

J'avoue que je saisis mal ta question.
SwingWorker c'est une classe dédiée à la création de threads. Pas de GUI fondamentalement.
En ce qui concerne les GUI on se sert de SwingWorker par exemple pour afficher une barre de progression pendant que le gros du code fait autre chose. On ne s'en sert pas comme tu dis (si j'ai bien compris).
Quant aux performances, si tu as bien codé, il ne devrait pas y avoir trop de dégradations. Mais je parle un peu dans le vide là car j'ai du mal à voir ce que tu fais.
Quant aux problèmes d'affichage attention, en Swing c'est toujours très délicat d'invoquer des composants en dehors du thread principal de l'application. On peut le faire, mais pas n'importe comment.

infaac
exmaple de code

Peux-tu jeter un coup d'oeil:

public Object construct() 
	{
		UserModalityManager.startModality();
		UserManagementBrowserHandler bh = UserManagementBrowserHandler.getCurrentBrowser();
		if (requestType_.equals("DELETE"))
		{
		  try
		  {
		    userManager_.removeUser(ctx_,user_);
		    DefaultMutableTreeNode node = (DefaultMutableTreeNode)node_.getParent();
	        int k = 0;
	        if (node != null)
	        {
	            k = node.getIndex(node_);
	            node.remove(k);
	        }
	        int[] childrenremoved = new int[1];
	        Object[] noderemoved = new Object[1];
	        childrenremoved[0] = k;
	        noderemoved[0] = node_;
	        ((DefaultTreeModel) bh.getTree().getModel()).nodesWereRemoved(node, childrenremoved, noderemoved);
		  }
		  catch (UserGuiException guiEx)
	      {
	        //trace_.lowTrace("UserManagementBrowserHandler:UnableToRemoveUser");
			UserManagementBrowserHandler.messageErrorDisplay(guiEx.getMessage());
	      }
	      catch (Exception e)
	      {
	          //trace_.lowTrace("UserManagementBrowserHandler:UnableToRemoveUser");
	        UserManagementBrowserHandler.messageErrorDisplay(e.getMessage());
	      }
		}
		else if (requestType_.equals("MULTI-DELETE"))
		{
		  UserManagementBrowserHandler bh2 = UserManagementBrowserHandler.getCurrentBrowser();
		  bh2.removeSelectedUsers(selectedUsers_);
		}
		else if (requestType_.equals("CREATE"))
		{
		  actionListener_.createUser();	
		}
		else if (requestType_.equals("UPDATE"))
		{
		  actionListener_.updateUser();  	
		}
		else if (requestType_.equals("FIND"))
		{
		  uw_.findUser();	
		}
		else if (requestType_.equals("SearchInAllContext"))
		{
		  uw_.SearchInAllContexts();	
		}
		else if (requestType_.equals("GetDef"))
		{
			
		}
		else if (requestType_.equals("UpdateContextConf"))
		{
		  
		  try
		  {
		    userManager_.UpdateContextConfiguration();
		    bh.doAfterUpdateContext();     
		  }
		  catch (UserGuiException e)
		  {
		    UserManagementBrowserHandler.messageErrorDisplay(e.getMessage());
		  }	
		}
		else if (requestType_.equals("UPDATEPWD"))
		{
			actionListener_.updatePwd();
		}
		else if (requestType_.equals("AUTHENTICATION"))
		{
		  userAuthen_.setCursor(new Cursor(Cursor.WAIT_CURSOR));
		  userAuthen_.doOnApplyButton();
		}
			
		return "";

	}
fredericmazue

A mon humble avis ça risque de ne pas aller. Dans la méthode construct il ne devrait pas y avoir d'actions *directes* sur des composants Swing parce qu'à ce moment tu ne te trouves pas dans le thread principal et Swing n'aime pas ça du tout. Ca peut marcher comme planter selon ta chance et ta version de JDK. Par planter je veux dire avoir un affichage corrompu. Sun a toujours dit qu'il ne faut pas procéder comme ça.

Si tu regardes ce qu'ils disent sur le site de Sun (là où tu as trouvé la classe SwingWorker) tu verras que quand ils agissent sur des composants Swing, ils le font indirectement par le biais de javax.swing.SwingUtilities.invokeLater ou javax.swing.SwingUtilities.invokeAndWait.

Selon moi tu dois faire pareil.