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
}
});
}
});
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? –
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. –
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. –