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 :

check box + Jlist


Sujet :

Composants Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 67
    Par défaut check box + Jlist
    Bonjour,

    Je cherche a cocher les cases d ' un jList
    J' ai un jlist(comportant 2 lignes) avec des checkbox et j ' aimerais pouvoir cocher la check box de la ligne 2 si une fonction retournant un booleen true se vérifie et la ligne 1 si elle retourne false


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(Serveur.getConnexion().verifier())

    , or je ne sais pas comment sélectionner la ligne a cocher dans mon renderer

    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
    public class RendererList  implements ListCellRenderer// rendu de l ' interface Annonces
    {private  Border border = BorderFactory.createCompoundBorder(BorderFactory.createMatteBorder( 0, 0, 1, 0, Color.BLACK ),
    		  BorderFactory.createEmptyBorder( 3, 3, 3, 3 ) );// bordures des lignes de la jlist
       public Component getListCellRendererComponent(
             JList list, Object value, int index, // jlist , ligne , index
             boolean isSelected, boolean hasFocus) // selectionnee ou pas , a le focus ou pas
       {
    	   JPanel panneau= new JPanel();// panneau dans la jlist
    	   panneau.setLayout(new BorderLayout());
    		panneau.setBackground(list.getBackground());// recupere couleur de la jlist
    		panneau.setOpaque(true);
    		panneau.setBorder(border); 
    	   JCheckBox checkBox = new JCheckBox();// case a cocher
     
    	   JLabel options=new JLabel();
    	   options.setText(value.toString());// affiche les lignes dans la jlist
     
     
          checkBox.setEnabled(list.isEnabled());
          //setSelected(((CheckListItem)value).isSelected());
          checkBox.setFont(list.getFont());
          checkBox.setBackground(list.getBackground());
     
         //checkBox.setText(value.toString());
         panneau.add(checkBox,BorderLayout.EAST);
         panneau.add(options,BorderLayout.WEST);
        if(Serveur.getConnexion().verifier())
        		 {
        	 checkBox.setSelected(true);    //setSelected(true);
        		 }
     
     
     
          return panneau;
       }
    }

    Merci de votre aide

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Le truc de base est que la JList n'est pas un composant prévu pour faire de l'édition. Or le fait de cocher une checkbox correspond à un mécanisme d'édition.

    Si tu veux une liste avec des checkboxex éditables je te conseille plutôt de passer par une JTable.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 67
    Par défaut
    Merci de ton aide
    J ' ai donc adapté mon modèle sur une Jtable avec une colonne , mais j ' ai toujours le meme probleme.
    Si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(Serveur.getConnexion().verifier())
        		 {
        	 checkBox.setSelected(true);    //setSelected(true);
        		 }
    ca me selectionne les 2 checkbox , or je voudrais uniquement selectionner la checkbox de la ligne 1

    meme en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(Serveur.getConnexion().verifier() && row==1)
        		 {
        	 checkBox.setSelected(true);    //setSelected(true);
        		 }
    ca ne fonctionne pas

    mon renderer est concu ainsi
    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
    public class RendererTable   extends DefaultTableCellRenderer// rendu de l ' interface Annonces
    {private  Border border = BorderFactory.createCompoundBorder(BorderFactory.createMatteBorder( 0, 0, 1, 0, Color.BLACK ),
    		  BorderFactory.createEmptyBorder( 3, 3, 3, 3 ) );// bordures des lignes de la jlist
    public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus, int row
            , int column) {
    	   JPanel panneau= new JPanel();// panneau dans la jlist
    	   panneau.setLayout(new BorderLayout());
    	   panneau.setBackground(table.getBackground());// recupere couleur de la jlist
    	   panneau.setOpaque(true);
     
    	  JCheckBox checkBox = new JCheckBox();// case a cocher
    	  JLabel options=new JLabel();
    	  options.setText(value.toString());// affiche les lignes dans la jlist
          checkBox.setEnabled(table.isEnabled());
          //setSelected(((CheckListItem)value).isSelected());
          checkBox.setFont(table.getFont());
          checkBox.setBackground(table.getBackground());
     
         //checkBox.setText(value.toString());
         panneau.add(checkBox,BorderLayout.EAST);
         panneau.add(options,BorderLayout.WEST);
         if( Serveur.getConnexion().verifier() && row==1)
        		 {
        	 checkBox.setSelected(true);    //setSelected(true);
        		 }
     
     
     
     
          return panneau;
       }
    }
    merci encore pour ton aide

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Comment as tu développé ton Editor?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 67
    Par défaut
    Je n ' en ai pas concu.
    Il me semble qu ' il n y en ait pas besoin pour un affichage simple de checkbox ou je me goure totalement ?

    merci encore

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Tu veux juste afficher la JCheckBox, ou faire en sorte qu'elle soit éditable?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 67
    Par défaut
    l ' afficher avec un état prédéfini et pouvoir cliquer moi meme sur les cases plus tard

    Il faut donc que je passe par un editor ?

    Merci

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Oui, pour pouvoir afficher une JCheckBox il faut un Renderer.

    Pour pouvoir la rendre éditable il te faut de plus un Editor et que le retour de la méthode isEditable(int row, int col) correspondant à ta cellule revoie true.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 67
    Par défaut
    Merci grace a ton aide , j' avance bien( mais je dois avouer que le composant jtable est compliqué a utiliser)
    J ' ai fait une refonte de mon appli pour séparer les divers couches.
    J' ai donc creer un objet Annonces qui contiendra ce que je veux dans la colonne de ma jtable: une chaine de carac et un booléen afin que la case soit cochée ou non.
    Puis j 'ai creer un modele pour remplir la jtable avec cette liste d ' objets et un rendu pour afficher tout ca.

    Annonces
    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
    public class Annonces {
    	private String typeMessage;
    	private boolean etat;
     
    	public Annonces(String typeMessage, boolean etat) {
    		super();
    		this.typeMessage = typeMessage;
    		this.etat = etat;
    	}
    	public String toString()
        {
     
          return typeMessage + " " + etat;
        }
    	public String getTypeMessage() {
    		return typeMessage;
    	}
    	public void setTypeMessage(String typeMessage) {
    		this.typeMessage = typeMessage;
    	}
    	public boolean isEtat() {
    		return etat;
    	}
    	public void setEtat(boolean etat) {
    		this.etat = etat;
    	}
     
    }
    Modele Jtable:

    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
    public class ModeleInterfaceAnnonces extends AbstractTableModel{// modele de l interface annonces
     
    private List<Annonces> annonces = new ArrayList<Greetings>();
    public ModeleInterfaceAnnonces(Connexion connexion)
    {
    	if(connexion.verifierGreeting())
    			{
    		annonces.add(new Annonces("Par defaut" , false));
    		annonces.add(new Annonces("Personnalisé" , true));
    			}
    	else 
    		{
    		 annonces.add(new Annonces("Par défaut" , true));
    		 annonces.add(new Annonces("Personnalisé" , false));
    		}
    }
     
     
    	public boolean isCellEditable(int row, int col){
    		return false; 
    	}
    	 public String getColumnName(int columnIndex) {
    	        return null;
    	    }
     
    	public int getColumnCount() {
     
    		return 1;
    	}
    	public int getRowCount() {
     
    		return annonces.size();
    	}
     
    	public Object getValueAt(int rowIndex, int columnIndex) {
     
    		if(columnIndex==0)
        	{
            return  annonces;
        	}
     
        	else
        		return null;
     
        }
     
    	}
    mon renderer:

    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
    package Rendu;
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.Point;
    import java.awt.Rectangle;
     
    import javax.swing.BorderFactory;
    import javax.swing.JCheckBox;
    import javax.swing.JLabel;
    import javax.swing.JList;
    import javax.swing.JPanel;
    import javax.swing.JTable;
    import javax.swing.ListCellRenderer;
     
    import javax.swing.border.Border;
    import javax.swing.table.DefaultTableCellRenderer;
     
    import Greetings.Greetings;
     
     
    public class RendererTableAnnonce   extends DefaultTableCellRenderer// rendu de l ' interface Annonces
    {
    private  Border border = BorderFactory.createCompoundBorder(BorderFactory.createMatteBorder( 0, 0, 1, 0, Color.BLACK ),
    		  BorderFactory.createEmptyBorder( 3, 3, 3, 3 ) );// bordures des lignes de la jlist
    public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus, int row
            , int column) {
     
    	   JPanel panneau= new JPanel();// panneau dans la jlist
    	   panneau.setLayout(new BorderLayout());
    	   panneau.setBackground(table.getBackground());// recupere couleur de la jlist
    	   panneau.setOpaque(true);
    	   JCheckBox checkBox = new JCheckBox();// case a cocher
    	   JLabel options=new JLabel();
    	   options.setText(value.toString());// affiche les lignes dans la jlist
    	    checkBox.setEnabled(table.isEnabled());
    	    checkBox.setFont(table.getFont());
    	    checkBox.setBackground(table.getBackground());
    	    if (isSelected) {// si on selectione une ligne de la jlist
    			panneau.setBackground(Color.CYAN);
    		}else{
    			panneau.setBackground(table.getBackground());
    		}
    	    System.out.println(value.getClass());
    	   if ( value instanceof Annonces ) { // permet de specifier que les lignes contiennent des messages(instance of permet de connaitre la classe d instanciation)
     
    		   Annonces annonces = (Annonces) value;
     
    			if (annonces.isEtat()){
    				checkBox.setSelected(( (Boolean) value).booleanValue());
     
    			}
    			 JLabel label= new JLabel(annonces.getTypeMessage());
    			  panneau.add(label,BorderLayout.WEST);
     
    	   }
    	   else System.out.println("instance Annonces non reconnues");
    	  panneau.add(options);
    	  panneau.add(checkBox,BorderLayout.EAST);
     
          return panneau;
       }
    }
    ma démarche est - elle bonne ?
    Je n ' arrive pas a rentrer dans ma condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( value instanceof Annonces ) {
    alors que j ' arrivais bien avec une jlist , c ' est propre aux jtable ?
    car quant je fais un syso de value.getClass() ca me retourne que la classe de value est ArrayList( alors que j ' ai une arrayList d 'Annonces)

    Merci pour toute ton aide

  10. #10
    Membre émérite Avatar de fraco
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 750
    Par défaut
    j' avance bien( mais je dois avouer que le composant jtable est compliqué a utiliser)
    Pour ma part, deux checkBoxes, je les mets dans un JPanel : tout simple, très facile !

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 67
    Par défaut
    j ' aurais bien fait pareil , mais mon tuteur m ' a imposé des contraintes

    Personne n ' a donc une idée pour que je puisse cocher ces checkbox ?

    Merci

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 67
    Par défaut
    J ' ai pu corriger la majeure partie de mes problèmes avec un peu de perséverance( cocher / décocher , conserver le stat de mes checkbox)
    mais il m ' en reste encore quelque uns et je bloque dessus svp.

    Lorsque j ' appelle mon editor me permettant de cocher/decocher via la methode setValue at du modele que j ' ai rédefini, il se produit un bug.
    Si je clique avec le bouton gauche de la souris enfoncé sur la cellule , la checkbox remplace tout le contenu de la cellule et se place a gauche alors qu ' elle etait initialement a droite


    je pensais au début que c ' etait un conflit avec le renderer , mais il n ' en est rien car je l ' ai désactivé pour tester.
    Je pense que c ' est a cause de la méthode de retour super.getTableCellEditorComponent(table, value, isSelected, row, column);

    mon editor:

    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
    public class EditorTableAnnonce extends DefaultCellEditor{
     
        public EditorTableAnnonce(JCheckBox checkBox) {
            super(checkBox);
     
     
        }
        public Component getTableCellEditorComponent(JTable table, Object value,
                boolean isSelected, int row, int column) {
     
                      if (value instanceof Annonces) {  
                             value = Boolean.valueOf( ((Annonces)value).isEtat() );  
                         }  
     
     
     
                      //super.setBackground(isSelected ? table.getSelectionBackground() : table.getBackground());
                      return super.getTableCellEditorComponent(table, value, isSelected, row, column); 
     
    }
    }
    comment peut on décocher automatiquement une case quant on en coche une ?
    Je suis obligé de cliquer pour décocher la case
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {  
                            Annonces coche = (Annonces) annonces.get(rowIndex);  
                           switch (columnIndex) {  
                           case 0:  
     
                               coche.setEtat(((Boolean) aValue).booleanValue());
                               break;  
                           }  
                           fireTableCellUpdated(rowIndex, columnIndex);  
                        }
    merci de votre aide

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Quel type de classe renvoie la colonne correspondant à celle où tu veux afficher ta checkbox?

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 67
    Par défaut
    Merci encore de ton aide
    Je n' ai que une colonne qui renvoi un objet Annonces(String + booléen)
    Et j ' utilise instanceof pour convertir value en un objet Annonce

    mon modele est concu ainsi
    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
    public class TableauPersonnalisesInterfaceAnnonces extends AbstractTableModel{// modele de l interface annonces
     
    /**
         * 
         */
        private static final long serialVersionUID = 1L;
    //Object[] data = {"Par defaut","Personnalisé"};    
     
    private List<Annonces> annonces = new ArrayList<Annonces>();
    public TableauPersonnalisesInterfaceAnnonces(Imap connexionImap)
    {
        if(connexionImap.verifierGreeting())
                {
            annonces.add(new Annonces("Par defaut" , false));
            annonces.add(new Annonces("Personnalisé" , true));
                }
        else 
            {
             annonces.add(new Annonces("Par défaut" , true));
             annonces.add(new Annonces("Personnalisé" , false));
            }
    }
     
     
        public boolean isCellEditable(int row, int col){
            return true; 
        }
         public String getColumnName(int columnIndex) {
                return null;
            }
     
        public int getColumnCount() {
     
            return 1;
        }
        public int getRowCount() {
     
            return annonces.size();
        }
     
        public Object getValueAt(int rowIndex, int columnIndex) {
             Annonces coche = (Annoncess) annonces.get(rowIndex);
     
     
     
            if(columnIndex==0)
            {
            return  annonces.get(rowIndex);
            }
            else
                return null;
     
     
        }
            public void setValueAt(Object aValue, int rowIndex, int columnIndex) {  
                            Annonces coche = (Annonces) annonces.get(rowIndex);  
                           switch (columnIndex) {  
                           case 0:  
     
                               coche.setEtat(((Boolean) aValue).booleanValue());
                               break;  
                           }  
                           fireTableCellUpdated(rowIndex, columnIndex);  
                        }
    merci encore

Discussions similaires

  1. check box pour afficher autre chose
    Par vincent1412 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/02/2006, 18h47
  2. [Javascript] probleme de check box
    Par stomerfull dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 08/02/2006, 08h09
  3. eVC++ 4 : check box transparente
    Par zenetcalme dans le forum MFC
    Réponses: 10
    Dernier message: 29/11/2005, 10h11
  4. cocher tout les check box
    Par Flob dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 17/02/2005, 11h29
  5. [FLASH 5] check box sous Flash 5
    Par Flash5man dans le forum Flash
    Réponses: 7
    Dernier message: 01/09/2004, 09h48

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