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

AWT/Swing Java Discussion :

JSlider : Forcer une valeur


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 14
    Par défaut JSlider : Forcer une valeur
    Bonjour à tous,

    Je vous explique mon petit projet, sur une fenêtre je dois mettre 6 JSliders, qui ont pour valeur maximale globale 100.
    En d'autres termes la valeur maxi de la somme de mes 6 sliders doit être 100.
    J'arrive bien à effectuer le contrôle et donc à déterminer la valeur maxi lorsque l'utilisateur fait glisser le sliders, mais lorsque je fait un setValue pour remettre le curseur d'un slider sur sa valeur maximale, c'est là que je rencontre un problème.

    J'avais tout d'abord fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jSlider1.setValue(maxi);
    maxi étant la valeur maximale déterminée, mais il ne se passe rien graphiquement sur le slider, en revanche lorsque je fait un getValue() derrière je récupère bien maxi

    J'ai ensuite essayer de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    jSlider1.getModel().setRangeProperties(maxi,
                                                         jSlider1.getExtent(), 
                                                         jSlider1.getMinimum(), 
                                                         jSlider1.getMaximum(), 
                                                         false);
    Mais même conclusion que précédemment

    J'ai aussi essayé çà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    jSlider1.setValue(maxi);
    jSlider1.invalidate();
    jSlider1.validate();
    jSlider1.repaint();
    Toujours le même comportement

    Puis en cherchant un peu sur le forum je suis tombé sur ce topic :
    http://www.developpez.net/forums/sho...hlight=JSlider
    Whaooo pile poil ce que je cherche
    Je met donc en place le code ce qui nous donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SwingUtilities.invokeLater(
     new Runnable() {
        public void run() {
           jSlider1.setValue(value0);
        }
     }
    );
    Ca marche très bien mais uniquement la première fois
    Les fois suivantes j'obtiens des comportements étrange et en règle générale le slider ne se repositionne pas.
    Je me suis donc dit que c'était le invokeLater qui ne fonctionnait pas et j'ai essayé avec un invokeAndWait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    try {
      SwingUtilities.invokeAndWait(
       new Runnable() {
    	public void run() {
               jSlider1.setValue(value0);
    	}
       });									
    } catch (Exception e) {
      // TODO: handle exception
    }
    mais j'ai une exception :
    Exception in thread "AWT-EventQueue-0" java.lang.Error: Cannot call invokeAndWait from the event dispatcher thread
    Sachant que j'effectue ce contrôle sur un évènement stateChanged positionné sur les sliders.

    Voilà si quelqu'un à une idée pour réussir d'une manière ou d'une autre à faire fonctionner ces 6 sliders ensemble je suis prenneur.

    Merci d'avance à ceux qui répondront

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 14
    Par défaut
    Rebonjour à tous.
    Bon après quelques cheveux arrachés et une bonne dose de caféine j'ai réussi à me dépatouiller tout seul.
    J'ai donc utilisé le invokeLater montré plus haut.
    Mais j'ai pris soin de bien nettoyer ma fonction de validation.
    Pour aider ceux qui auraient besoin de la même chose, voici le code.
    Sur chacun des sliders il faut ajouter un évènement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    jSlider1.addChangeListener(
        new ChangeListener() {
               public void stateChanged(ChangeEvent evt) {
                   jSliderStateChanged(evt);
               }
    });
    Et ensuite la fonction jSliderStateChanged donne çà
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    private void jSliderStateChanged(ChangeEvent evt){
     final JSlider source = (JSlider)evt.getSource();
     int oldValue = 0; 
     if (!source.getValueIsAdjusting()) {
          {
           if(source.getName().equals("jSlider1")){
               oldValue = value1;
           }
           else{
             if(source.getName().equals("jSlider2")){
               oldValue = value2;
             }
             else{
               if(source.getName().equals("jSlider3")){
                 oldValue = value3;
               }
               else{
                 if(source.getName().equals("jSlider4")){
                   oldValue = value4;
                 }
                 else{
                   if(source.getName().equals("jSlider5")){ 
                     oldValue = value5;
                   }
                   else{
                       if(source.getName().equals("jSlider6")){
                           oldValue = value6;
                       }
                     }
                   }
                 }
               }
              }
             }
    if (source.getValue() > oldValue){
    //Attention à ne pas dépasser les 100% pour tous les sliders compris
    //On va donc déterminer la valeur maxi
    //On commence par lire tous les sliders
    int maxi = 0;
    maxi = maxi + value1;
    maxi = maxi + value2;
    maxi = maxi + value3;
    maxi = maxi + value4;
    maxi = maxi + value5;
    maxi = maxi + value6;
    //Puis on enlève la valeur précédente du notre
    maxi = MAX - maxi + oldValue;
    //Si la valeur que l'on veut mettre est supérieure au maxi 
    //il faut forcer la valeur du slider en cours au maxi
     if(source.getValue() > maxi){
    	final int value0 = maxi;
    	SwingUtilities.invokeLater(new Runnable() {
                     public void run() {
                        source.setValue(value0);
                     }
              }
            );
      }
    }
    saveValueSliders();
    setValueBar100();	
    refreshValeurSliders();
    }
    }

    Sachant que :
    MAX est un constante égale à 100
    saveValueSliders() est un méthode qui met dans value 1 à 6 la valeur des 6 sliders
    setValueBar100() est une méthode qui met à jour une barre de progression graduée de 0 à 100 ==> La Jauge
    refreshValeurSliders() est une méthode qui met à jour les labels des valeurs de sliders.

    Voila en espérant que çà serve à d'autres.

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

Discussions similaires

  1. [A-07] Forcer une valeur dans un champ
    Par Myogtha dans le forum VBA Access
    Réponses: 2
    Dernier message: 23/10/2008, 19h19
  2. Réponses: 7
    Dernier message: 20/11/2007, 12h37
  3. [Formulaire]forcer une valeur par défaut
    Par Dore dans le forum IHM
    Réponses: 2
    Dernier message: 03/04/2007, 13h35
  4. [DTD]Forcer une valeur d'une balise
    Par mamiberkof dans le forum Valider
    Réponses: 1
    Dernier message: 22/01/2007, 22h26
  5. Forcer une valeur alpha en numérique
    Par lodan dans le forum Langage
    Réponses: 2
    Dernier message: 14/11/2006, 17h29

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