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

Composants Java Discussion :

[JList] JSlider pour chaque élément


Sujet :

Composants Java

  1. #1
    Membre régulier Avatar de Paniez
    Homme Profil pro
    Communication & Webservices
    Inscrit en
    Janvier 2003
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Communication & Webservices
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 186
    Points : 107
    Points
    107
    Par défaut [JList] JSlider pour chaque élément
    Bonjour à tous,

    J'ai un soucis avec une de mes JList : j'essaye de faire une JList avancée où chaque élément doit contenir du texte avec un JSlider (je me suis inspiré de ce tuto pour faire le renderer).

    J'ai bien le renderer que je veux, le model associé fonctionne bien (ajout/suppression/modification).

    Le problème que je rencontre vient du JSlider : je ne peux pas bouger le "bouton" pour changer sa valeur.

    J'arrive bien à récupérer l'élèment de la JList sélectionné, même à savoir si on clic sur le texte ou sur le JSlider, mais pas avoir un JSlider "utilisable".

    Je pense que l'évènement "n'arrive pas" jusqu'au JSlider (selon le tuto mis ci-dessus, lors du clic il redessine la checkbox - ce qui est assez facile étant donné qu'il n'y a que 2 états, mais bien plus astreignant pour un JSlider).

    Si quelqu'un a une idée...

  2. #2
    Membre régulier Avatar de Paniez
    Homme Profil pro
    Communication & Webservices
    Inscrit en
    Janvier 2003
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Communication & Webservices
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 186
    Points : 107
    Points
    107
    Par défaut
    Re,

    Je vais me répondre à moi-meme.
    Je n'ai pas encore la solution finale, mais je suis très proche.

    Toujours à partir du tuto mis en lien, j'ai modifié la méthode mouseClicked, où j'ai rajouté un détection de la position X, que je transforme en valeur de mon JSlider (en gros, si if(100<x<=200) jslider.setvalue(0); else if(200<x<=300) ....).

    Le problème est qu'il faut que je clique ailleurs (donc, plus sur cet item de ma jlist) pour avoir le rendu visuel ; je me suis dit alors de rajouter un jslider.repaint(); mais c'est limite encore pire (sorte de mélange entre les valeurs des jsliders de tous mes items).

    Est-ce que quelqu'un sait comment faire pour avoir mon "refresh" actif ??

    Merci d'avance

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mai 2007
    Messages : 149
    Points : 145
    Points
    145
    Par défaut
    Bonjour,

    Tu as bien rajouté un évènement ChangeListener sur tes JSlider ? parce que dans mes souvenirs, lorsque j'en avais utilisé, le refresh se faisait tout seul.

  4. #4
    Membre régulier Avatar de Paniez
    Homme Profil pro
    Communication & Webservices
    Inscrit en
    Janvier 2003
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Communication & Webservices
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 186
    Points : 107
    Points
    107
    Par défaut
    Citation Envoyé par keul85 Voir le message
    Bonjour,

    Tu as bien rajouté un évènement ChangeListener sur tes JSlider ? parce que dans mes souvenirs, lorsque j'en avais utilisé, le refresh se faisait tout seul.
    Re,

    Effectivement, je n'avais pas mis de changeListener, mais ça ne change rien (du moins, ce n'est pas encore le résultat escompté) ; j'ai l'impression, en fait, que tous mes jsliders se "cale" sur la meme valeur (à partir du second changement de valeur).

    Du coup, dans la méthode stateChanged, il faut faire juste un jslider.repaint() ?

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mai 2007
    Messages : 149
    Points : 145
    Points
    145
    Par défaut
    Je viens de relire ton problème, et en fait, il n'est pas normal que tu n'arrives pas à bouger le curseur du JSlider (d'ailleurs si tu n'arrives pas à le bouger, lui ajouter un listener ne sert à rien, donc ma question précédente est stupide )

    On peut avoir un bout de code correspondant à la création de la liste et des sliders pour essayer d'y voir plus clair ?

  6. #6
    Membre régulier Avatar de Paniez
    Homme Profil pro
    Communication & Webservices
    Inscrit en
    Janvier 2003
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Communication & Webservices
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 186
    Points : 107
    Points
    107
    Par défaut
    Citation Envoyé par keul85 Voir le message
    On peut avoir un bout de code correspondant à la création de la liste et des sliders pour essayer d'y voir plus clair ?
    Re,

    Allez, du code et du code :
    - Code du cellrenderer (jsFrequence est le jslider par extends) :
    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
     
    public class CheckListCellRenderer extends JPanel implements ListCellRenderer, ChangeListener
    {
        private Scenario sCorrespondant;
        private ListCellRenderer delegate; 
        private ListSelectionModel selectionModel;
        private JPanel jpNom,jpFrequence;
        private jsFrequence jsfFrequence;
     
        public CheckListCellRenderer(Scenario _s,ListCellRenderer renderer, ListSelectionModel selectionModel)
        { 
        	this.sCorrespondant=_s;
            this.delegate = renderer; 
            this.selectionModel = selectionModel; 
            jsfFrequence=new jsFrequence(false);
            jsfFrequence.addChangeListener(this);
            jsfFrequence.setOpaque(false);
     
            jpNom=new JPanel(new BorderLayout());
            jpNom.setMinimumSize(new Dimension(160,45));
            jpNom.setPreferredSize(new Dimension(160,45));
    	jpNom.setMaximumSize(new Dimension(160,45));
    	jpNom.setOpaque(false);
     
    	jpFrequence=new JPanel(new BorderLayout());
            jpFrequence.setOpaque(false);
     
            setLayout(new FlowLayout()); 
            setOpaque(false); 
        } 
     
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus){
        	Component renderer = delegate.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            removeAll(); 
     
            if(!list.isSelectionEmpty())
            {
            	StyleFrequence sfTmp=sCorrespondant.donnePlagesDefaut().donne1StyleFrequence(list.getSelectedValue().toString());
     
                if(sfTmp!=null)
                	jsfFrequence.setValue(sfTmp.getIFrequence());
            }
     
            jpNom.add(renderer,BorderLayout.CENTER);
            jpFrequence.add(jsfFrequence,BorderLayout.CENTER);
     
            add(jpNom);
            add(Box.createHorizontalStrut(1));
            add(jpFrequence);
            return this; 
        }
     
    	public void stateChanged(ChangeEvent arg0)
    	{
    		//jsfFrequence.repaint();
    	}
    }
    - Code du manager (j'ai modfié que mouseClicked) :

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    public class CheckListManager extends MouseAdapter implements ListSelectionListener, ActionListener
    {
    	private Scenario sCorrespondant;
        private ListSelectionModel selectionModel = new DefaultListSelectionModel(); 
        private JList list = new JList(); 
        int hotspot = new jsFrequence(false).getPreferredSize().width; 
     
        public CheckListManager(Scenario _s,JList list)
        { 
        	this.sCorrespondant=_s;
            this.list = list; 
            list.setCellRenderer(new CheckListCellRenderer(_s,list.getCellRenderer(), selectionModel)); 
            list.registerKeyboardAction(this, KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), JComponent.WHEN_FOCUSED); 
            list.addMouseListener(this);
            selectionModel.addListSelectionListener(this); 
        } 
     
        public ListSelectionModel getSelectionModel(){ 
            return selectionModel; 
        } 
     
        private void toggleSelection(int index){ 
            if(index<0) 
                return; 
     
            if(selectionModel.isSelectedIndex(index)) 
                selectionModel.removeSelectionInterval(index, index); 
            else 
                selectionModel.addSelectionInterval(index, index); 
        } 
     
        /*------------------------------[ MouseListener ]-------------------------------------*/ 
     
        public void mouseClicked(MouseEvent me){ 
            int index = list.locationToIndex(me.getPoint());
            int frequence=99;
     
            System.out.println("clic sur "+index+" en :"+me.getX()+" >> "+frequence);
     
    		if(me.getX()>186 && me.getX()<=218)
    			frequence=0;
        	else
        		if(me.getX()>218 && me.getX()<=242)
        			frequence=1;
            	else
            		if(me.getX()>242 && me.getX()<=264)
            			frequence=2;
                	else
                		if(me.getX()>264 && me.getX()<=285)
                			frequence=3;
                    	else
                    		if(me.getX()>285 && me.getX()<=312)
                    			frequence=4;
     
    		if(frequence!=99)
    sCorrespondant.donnePlagesDefaut().donne1StyleFrequence(list.getModel().getElementAt(index).toString()).setIFrequence(frequence);
     
     
            if(index<0) 
                return;
     
        	if(me.getX()>list.getCellBounds(index, index).x+hotspot) 
        		return;
     
     
            toggleSelection(index); 
        } 
     
        /*-----------------------------[ ListSelectionListener ]---------------------------------*/ 
     
        public void valueChanged(ListSelectionEvent e){ 
            list.repaint(list.getCellBounds(e.getFirstIndex(), e.getLastIndex())); 
        } 
     
        /*-----------------------------[ ActionListener ]------------------------------*/ 
     
        public void actionPerformed(ActionEvent e){ 
            toggleSelection(list.getSelectedIndex()); 
        } 
    }

  7. #7
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Euh, juste comme ça, une JList n'est pas un composant éditable, donc activer un comopsant à l'intérieur est un poil tricky

    Utilises plutôt une JTable a une colonne avec un couple renderer/editor, ça ira plus vite

  8. #8
    Membre régulier Avatar de Paniez
    Homme Profil pro
    Communication & Webservices
    Inscrit en
    Janvier 2003
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Communication & Webservices
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 186
    Points : 107
    Points
    107
    Par défaut
    Citation Envoyé par sinok Voir le message
    Euh, juste comme ça, une JList n'est pas un composant éditable, donc activer un comopsant à l'intérieur est un poil tricky

    Utilises plutôt une JTable a une colonne avec un couple renderer/editor, ça ira plus vite
    Salut,

    J'avais vu également ce code, mais vu la longueur ... Du coup, je m'étais dit, vu que c'est juste une position de clic qui détermine la valeur, de reprendre son code du checkbox et de déterminer la valeur en fonction de la position du clic.

    Soit, je vais repartir dans du code plus complexe.
    Je vous tiens au courant.

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/12/2009, 18h14
  2. menu : background-color pour chaque élément ?
    Par evevev dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 18/10/2009, 17h10
  3. Calcul de la Médiane pour chaque élément d'une table
    Par yuekerobero dans le forum Requêtes
    Réponses: 11
    Dernier message: 30/09/2008, 12h01
  4. [MySQL] Afficher une icône pour chaque élément trouvé
    Par cdevl32 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 11/11/2007, 22h29
  5. Boucle : pour chaque élément d'un ensemble ?
    Par monstroplante dans le forum Langage
    Réponses: 7
    Dernier message: 07/11/2005, 15h45

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