2017-06-21 4 views
1

J'utilise Eclipse RAP et avoir le cas d'utilisation suivante:Dans Eclipse RAP, comment pousser/forcer l'état actuel de l'interface utilisateur vers le client?

  • recherche Saisissez du texte dans un champ Text et lancer la recherche
  • changer un texte Label-« recherche .... »
  • faire la recherche réelle (async) et le résultat d'affichage dans un Table

le problème, même si l'étiquette doit changer pour « la recherche .... " avant que la recherche proprement dite ne commence, elle est remplacée par " recherche .... " une fois la recherche terminée.

Ce que je suis à la recherche est un moyen de pousser/force/mettre à jour l'état d'interface utilisateur actuelle au client après que l'étiquette a changé, avant la recherche:

  • recherche Saisissez du texte dans un champ Text et début Recherche
  • changer un texte Label-« recherche .... »
  • pousser l'état actuel de l'interface utilisateur au client
  • faire la recherche réelle (async) et l'affichage d'un résultat dans Table

Voici quelques exemples de code:

Label statusLabel = new Label(parent, SWT.NONE); 
    Text searchText = new Text(parent, SWT.SEARCH); 
    searchText.addSelectionListener(new SelectionAdapter() { 
     @Override 
     public void widgetDefaultSelected(SelectionEvent e) { 
      // change label 
      statusLabel.setText("searching..."); 

      // HERE force client update 

      // start searching 
      Display.getCurrent().asyncExec(new Runnable() { 
       @Override 
       public void run() { 
        // do actual search 
       } 
      }); 
     } 
    }); 

Répondre

2

asyncExec fonctionne toujours le code dans le thread d'interface utilisateur, il retarde juste un peu jusqu'à ce que le prochain appel à Display.readAndDispatch. Ainsi, votre code de recherche bloquera toujours et ne permet pas la mise à jour de l'étiquette.

Vous devez réellement lancer la recherche dans un fil séparé.

asyncExec est destiné à être utilisé dans un thread d'arrière-plan pour exécuter une petite quantité de code dans le thread UI lorsque cela est possible. (Vous devez utiliser Display.getDefault() plutôt que Display.getCurrent() dans un fil d'arrière-plan).

Donc, dans votre arrière-plan fil que vous faites quelque chose comme:

while (more to do) 
{ 
    .... do a step of the search 

    Display.getDefault().asyncExec(.... UI update code ....); 
} 
+0

Si je lance la recherche dans un thread séparé, je ne serai pas en mesure d'accéder au droit de l'interface utilisateur? par exemple. mise à jour de l'étiquette d'état, mise à jour du tableau des résultats Je devrais rencontrer une exception "Invalid thread accès", je suppose? –

+0

Vous utilisez 'asyncExec' (ou' syncExec') dans le thread d'arrière-plan pour exécuter votre code de mise à jour de l'interface utilisateur - c'est ce à quoi il sert. –

+0

Display.getDefault() et Display.getCurrent() étaient tous les deux null dans le thread, je devais le stocker comme variable avant de démarrer le thread. –