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 Discussion :

uicontrol slider : update seulement à la fin


Sujet :

Interfaces Graphiques

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur en analyse décisionnelle
    Inscrit en
    Juin 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur en analyse décisionnelle

    Informations forums :
    Inscription : Juin 2013
    Messages : 113
    Points : 133
    Points
    133
    Par défaut uicontrol slider : update seulement à la fin
    Bonjour,

    J'ai trouvé sur Internet plusieurs discussions où l'on cherche à faire en sorte que le slider s'exécute en continu.

    Or, mon problème est l'inverse. Lorsqu'on maintient le slider appuyé, le callback finit par s'exécuter et la queue des événements devient lourde, alors je finis par avoir un délai de plusieurs secondes lorsque je relâche le slider.

    Je suis débutant en matière de GUI, alors je suis désolé si c'est une notion de base qui m'a filé entre les doigts.

    J'aimerais que le callback s'exécute uniquement lorsque le slider est relâché, quelque soit la durée qu'il est maintenu.

    En ce moment, j'ai plusieurs slider et edit qui ont la même fonction de callback, mais qui passent chacun en paramètre un "id" différent qui est utilisé par la fonction pour déterminer l'action à prendre.

    Merci,

    Éric

  2. #2
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Bonjour,

    Pourrais-tu nous montrer le code que tu utilises pour le slider?

    Duf
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur en analyse décisionnelle
    Inscrit en
    Juin 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur en analyse décisionnelle

    Informations forums :
    Inscription : Juin 2013
    Messages : 113
    Points : 133
    Points
    133
    Par défaut
    Bonjour,

    Voici le code de ce uicontrol :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sliderA1 = uicontrol('Style', 'slider',...
        'Units','normalized',...
        'SliderStep',[Astep/(Amax-Amin),5*Astep/(Amax-Amin)],...
        'Position', [0.07 0.9 0.3 0.05],...
        'Min',Amin,'Max',Amax,'Value',A1,...
        'Enable',sliders,...
        'Callback', {@plot_callback,1});
    En ce moment, si on maintient la souris enfoncée, il finira par envoyer la fonction du Callback en queue, créant un "lag" et parfois même un blocage qui fait en sorte que la fonction ne s'exécute pas pour la dernière valeur réelle du slider.

    J'aimerais tout simplement m'assurer que le Callback n'appelle la fonction qu'à la fin (lorsque la souris est relâchée ou lorsque la flèche du clavier est relâchée).

    Merci,

    Éric

  4. #4
    Membre éclairé
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Points : 719
    Points
    719
    Par défaut
    Bonjour,

    Je connais ce problème : malheureusement, il n'existe pas de solution toute faite à ce problème. Il va falloir soit que tu te contentes de ça, soit que tu te coltines toi-même la programmation de cette fonctionnalité, j'en ai peur (bon courage au passage )

    Idée en vrac :
    - test sur les clics de la souris dans une figure (même pas sur le slider, sur la figure :/)
    - tu peux feinter : tu rajoutes un edit text qui change la valeur de ton slider... comme ça, l'utilisateur peut directement indiquer la valeur d'intérêt (c'est la solution que j'ai choisie : simple efficace)

    Cordialement,
    Je ne réponds pas aux MP techniques. Le forum est là pour ça.
    La raison est simple : il est ennuyeux de répondre à une seule personne, alors que la réponse peut servir à tout le monde.
    Conclusion : n'hésitez pas à utiliser le forum pour poser vos questions.
    Matlab 2005 - ver.7.1.0.183 (R14) Service Pack 3

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur en analyse décisionnelle
    Inscrit en
    Juin 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur en analyse décisionnelle

    Informations forums :
    Inscription : Juin 2013
    Messages : 113
    Points : 133
    Points
    133
    Par défaut
    Citation Envoyé par tachmou Voir le message
    - tu peux feinter : tu rajoutes un edit text qui change la valeur de ton slider... comme ça, l'utilisateur peut directement indiquer la valeur d'intérêt (c'est la solution que j'ai choisie : simple efficace)
    C'est ce que j'ai fait, mais le slider n'a alors malheureusement plus sa raison d'être outre que pour visualiser le positionnement entre le min et le max.

  6. #6
    Membre éclairé
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Points : 719
    Points
    719
    Par défaut
    Sauf si tu veux faire des modifications pas à pas...

    Malheureusement, si tu veux un truc plus chiadé, je te conseille dans ce cas de créer ton propre slider dans une classe faite pour, histoire que tu puisses réutiliser ton slider plusieurs fois directement. Bon courage dans ce cas

    Autres idées :
    - tu peux te démerder pour créer un timer qui s'initialise au début de ton programme avec une pause de 1/2 secondes juste après, et qui se réinitialise à la fin de l’exécution de tes calculs : tu n'as plus qu'à vérifier que la durée du timer soit supérieure à 1 seconde pour être sûr de ne pas réexecuter immédiatement tes calculs...
    - tu peux essayer de détecter les clics de souris comme je t'ai dit et attendre 1/2 secondes après un relâchement de souris sans re-cliquer pour lancer ton calcul...

    Bref, pas simple quoi, et à faire soit-même.

    Sinon, va checker du côté de matlab central... il y a peut-être des nouvelles choses

    Bon courage
    Je ne réponds pas aux MP techniques. Le forum est là pour ça.
    La raison est simple : il est ennuyeux de répondre à une seule personne, alors que la réponse peut servir à tout le monde.
    Conclusion : n'hésitez pas à utiliser le forum pour poser vos questions.
    Matlab 2005 - ver.7.1.0.183 (R14) Service Pack 3

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur en analyse décisionnelle
    Inscrit en
    Juin 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur en analyse décisionnelle

    Informations forums :
    Inscription : Juin 2013
    Messages : 113
    Points : 133
    Points
    133
    Par défaut
    J'ai trouvé une solution, mais il faut passer par Java avec la fonction sur findjobj sur le File Exchange.

    Par contre, j'avais encore un problème que j'ai réussi à contourner, mais sans savoir la bonne façon de faire que quelqu'un pourrait peut-être me trouver.

    Voici ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    sliderA1 = uicontrol('Style', 'slider',...
        'Units','normalized',...
        'SliderStep',[Astep/(Amax-Amin),5*Astep/(Amax-Amin)],...
        'Position', [0.07 0.9 0.3 0.05],...
        'Min',Amin,'Max',Amax,'Value',A1,...
        'Enable',sliders,...
        'Callback',{@edit_callback,1});
     
    jbh = findjobj(sliderA1);
    set(jbh, 'MouseReleasedCallback',{@plot_callback,1});
    set(jbh, 'KeyReleasedCallback',{@plot_callback,1});
    jbh = findjobj('class','basicarrowbutton');
    set(jbh, 'MouseReleasedCallback',{@plot_callback,1});
    set(jbh, 'KeyReleasedCallback',{@plot_callback,1});
    Le callback du slider sert à mettre à jour en temps réelle la valeur du edit à côté de lui. Ce n'est pas trop grave s'il finit par y avoir un "lag" puisque ce n'est pas lourd.

    Ensuite, je trouve l'objet Java pour avoir accès à ses callbacks. Cependant, mon problème était que l'objet renvoyé ne semblait pas inclure les petites flèches du slider, alors appuyer sur les petites flèches n'avait pas d'effet. Je trouve donc les deux objets des deux petites flèches, mais je ne sais pas comment pointer directement ces flèches à ce slider puisque j'ai plusieurs sliders...

    Rendu à ce point, je suis certain qu'il y a moyen et que je finirai par trouver ou quelqu'un ici pourra m'aider.

    Merci,

    Éric

  8. #8
    Membre habitué
    Homme Profil pro
    Ingénieur en analyse décisionnelle
    Inscrit en
    Juin 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur en analyse décisionnelle

    Informations forums :
    Inscription : Juin 2013
    Messages : 113
    Points : 133
    Points
    133
    Par défaut
    Voilà ma solution pour le moment. J'ai plus de deux sliders, mais c'était simplement pour montrer le cas à plusieurs sliders. J'aurais sûrement pu automatiser encore plus la solution, mais bon.

    La figure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    hwait = waitbar(0,'Please wait...','windowstyle','modal');
    frames = java.awt.Frame.getFrames();
    frames(end).setAlwaysOnTop(true);
     
    hFig = figure('Position', [50, 600, 600, 400],...
        'Name', 'GUI',...
        'NumberTitle', 'off',...
        'MenuBar', 'none',...
        'CloseRequestFcn',{@closeall});
     
    jFigPeer = get(handle(hFig),'JavaFrame');
    jFigPeer.getFigurePanelContainer.setEnabled(false);
    Un exemple avec plusieurs sliders :

    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
    uicontrol('Style', 'text',...
        'Units','normalized',...
        'Position', [0.01 0.9 0.06 0.04],...
        'String', 'A1',...
        'BackgroundColor',get(0,'DefaultFigureColor'));
    sliderA1 = uicontrol('Style', 'slider',...
        'Units','normalized',...
        'SliderStep',[Astep/(Amax-Amin),5*Astep/(Amax-Amin)],...
        'Position', [0.07 0.9 0.3 0.05],...
        'Min',Amin,'Max',Amax,'Value',A1,...
        'Enable',sliders,...
        'Callback',{@slider_callback,1});
    editA1 = uicontrol('Style', 'edit',...
        'Units','normalized',...
        'Position', [0.38 0.9 0.1 0.05],...
        'String',num2str(A1),...
        'Callback', {@plot_callback,1});
    uicontrol('Style', 'text',...
        'Units','normalized',...
        'Position', [0.5 0.9 0.06 0.04],...
        'String', 'A2',...
        'BackgroundColor',get(0,'DefaultFigureColor'));
    sliderA2 = uicontrol('Style', 'slider',...
        'Units','normalized',...
        'SliderStep',[Astep/(Amax-Amin),5*Astep/(Amax-Amin)],...
        'Position', [0.56 0.9 0.3 0.05],...
        'Min',Amin,'Max',Amax,'Value',A2,...
        'Enable',sliders,...
        'Callback', {@slider_callback,2});
    editA2 = uicontrol('Style', 'edit',...
        'Units','normalized',...
        'Position', [0.87 0.9 0.1 0.05],...
        'String',num2str(A2),...
        'Callback', {@plot_callback,2});
    Et à la toute fin de la définition des éléments de la figure :

    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
    jbh = findjobj(sliderA1);
    set(jbh, 'MouseReleasedCallback',{@plot_callback,1});
    set(jbh, 'KeyReleasedCallback',{@plot_callback,1});
    jbh = findjobj(sliderA2);
    set(jbh, 'MouseReleasedCallback',{@plot_callback,2});
    set(jbh, 'KeyReleasedCallback',{@plot_callback,2});
     
    jfig = findjobj(hFig);
    [~, ~, parentIds, ~] = findjobj(hFig,'class','basicarrowbutton');
    for i = 1:numel(parentIds)
        set(jfig(parentIds(i)+1),'MouseReleasedCallback',get(jfig(parentIds(i)),'MouseReleasedCallback'));
        set(jfig(parentIds(i)+2),'MouseReleasedCallback',get(jfig(parentIds(i)),'MouseReleasedCallback'));
        set(jfig(parentIds(i)+1),'KeyReleasedCallback',get(jfig(parentIds(i)),'KeyReleasedCallback'));
        set(jfig(parentIds(i)+2),'KeyReleasedCallback',get(jfig(parentIds(i)),'KeyReleasedCallback'));
        waitbar(i/numel(parentIds));
    end
     
    jFigPeer.getFigurePanelContainer.setEnabled(true);
    close(hwait);
    Les sliders font uniquement changer la valeur des edits en temps réel. Une fois que la souris ou la touche du clavier est relâchée, alors la fonction lourde est appelée.

    Par contre, pour encore plus de sécurité, je me demandais s'il était possible d'avoir accès à la queue des événements afin de supprimer certains événements en cours pour laisser place au nouvel événement ?

Discussions similaires

  1. Update seulement non numérique
    Par cmoi70 dans le forum MySQL
    Réponses: 1
    Dernier message: 02/11/2010, 12h50
  2. Update Slider selon valeur de chart
    Par lune2009 dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 01/06/2010, 10h43
  3. [AC-2007] trier une liste en mettant seulement certains enregistrements en fin de liste ?
    Par tibofo dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 29/05/2010, 19h26
  4. Slider horizontal sans fin
    Par mdr_cedrick dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 29/10/2008, 10h08
  5. Problème d'update de valeur GUI et sliders
    Par benji2642 dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 01/03/2007, 19h24

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