Listener de selection d'un checkBox dans une JTable [Résolu]

cs_biboobib 95 Messages postés dimanche 29 juillet 2007Date d'inscription 27 août 2011 Dernière intervention - 3 mai 2008 à 18:31 - Dernière réponse : cs_biboobib 95 Messages postés dimanche 29 juillet 2007Date d'inscription 27 août 2011 Dernière intervention
- 7 mai 2008 à 20:34
Salut a vous tous!!

j'ai réussi a faire intégrer le JCheckBox dans le JTable.. mais il me reste une petite probléme.. c'est que j'arrive pas a réaliser un listener pour la selection de JCheckBox dans la table..
et je sais pas s'il existe une méthode prédéfini pour ca!!

voici ma classe EachRowEditor qui implemente le TableCellEditor..

j'éspère trouver l'aide , c trés important.. merci d'avance!!

class EachRowEditor implements TableCellEditor {
  protected Hashtable editors;

  protected TableCellEditor editor, defaultEditor;

  JTable table;
  JCheckBox cb=new JCheckBox();

  /**
   * Constructs a EachRowEditor. create default editor
   *
   * @see TableCellEditor
   * @see DefaultCellEditor
   */
  public EachRowEditor(JTable table) {
    this.table = table;
    editors = new Hashtable();
    defaultEditor = new DefaultCellEditor(cb);
  }

  /**
   * @param row
   *            table row
   * @param editor
   *            table cell editor
   */
  public void setEditorAt(int row, TableCellEditor editor) {
    editors.put(new Integer(row), editor);
  }

  public Component getTableCellEditorComponent(JTable table, Object value,
      boolean isSelected, int row, int column) {
    //editor = (TableCellEditor)editors.get(new Integer(row));
    //if (editor == null) {
    //  editor = defaultEditor;
    //}
    return editor.getTableCellEditorComponent(table, value, isSelected,
        row, column);
  }

  public Object getCellEditorValue() {
    return editor.getCellEditorValue();
  }

  public boolean stopCellEditing() {
    return editor.stopCellEditing();
  }

  public void cancelCellEditing() {
    editor.cancelCellEditing();
  }

  public boolean isCellEditable(EventObject anEvent) {
    selectEditor((MouseEvent) anEvent);
    return editor.isCellEditable(anEvent);
  }

  public void addCellEditorListener(CellEditorListener l) {
    editor.addCellEditorListener(l);
  }

  public void removeCellEditorListener(CellEditorListener l) {
    editor.removeCellEditorListener(l);
  }

  public boolean shouldSelectCell(EventObject anEvent) {
    selectEditor((MouseEvent) anEvent);
    return editor.shouldSelectCell(anEvent);
  }

  protected void selectEditor(MouseEvent e) {
    int row;
    if (e == null) {
      row = table.getSelectionModel().getAnchorSelectionIndex();
    } else {
      row = table.rowAtPoint(e.getPoint());
    }
    editor = (TableCellEditor) editors.get(new Integer(row));
    if (editor == null) {
      editor = defaultEditor;
    }
  }
  }
Afficher la suite 

9 réponses

Répondre au sujet
cs_biboobib 95 Messages postés dimanche 29 juillet 2007Date d'inscription 27 août 2011 Dernière intervention - 7 mai 2008 à 20:34
+3
Utile
enfin j'ai trouver une petite solution pour ca!

j'ai utliser la méthode
stateChanged() de la class Changelistener!! il intercepte les
changement dans la checkBox est renvoi l'index de la ligne selectionné ..

et j'ai jouer sur des variables pour atteindre mon but..!

et ca marché!.. merci a toi!
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_biboobib
didoux95 845 Messages postés mardi 25 avril 2006Date d'inscription 1 août 2017 Dernière intervention - 3 mai 2008 à 18:46
0
Utile
Slt.
Pour ajouter un listener a ta JCheckBox tu peux faire (valable pour n'import qul composants du paquetage swing) :

maCheckBox.addChangeListener(new ChangeListener () {
   public void stateChanged (ChangeEvent evt) {
      //Choses à faire lorsque la JCheckBox à changé d'état
   }
}

+
Commenter la réponse de didoux95
cs_biboobib 95 Messages postés dimanche 29 juillet 2007Date d'inscription 27 août 2011 Dernière intervention - 4 mai 2008 à 00:06
0
Utile
oui, mais où j'ajoute le listener ? dans cette class ?
Commenter la réponse de cs_biboobib
cs_biboobib 95 Messages postés dimanche 29 juillet 2007Date d'inscription 27 août 2011 Dernière intervention - 4 mai 2008 à 00:29
0
Utile
j'ai ajouter le listener dans le constructeur de ma class EachRowEditor , le problém c'est que dans le JTable il ya plusieurs JChekBox (1 dans chaque ligne) , alors il ecoute sur tt les JCheckBox , j vais t'expliqué:

voilà:

 cb.addChangeListener(new ChangeListener () {
   public void stateChanged (ChangeEvent evt) {
      if(cb.isSelected()==true)
      {
        System.out.println("******selected******");
      }
      else{System.out.println("******not selected******");}
   }
});

et il maffiche dans le console: un message pour chaque JCheckBox!! si j'ai 4 JCheckBox et la 1ér est selectionné!

******selected******
******not selected******
******not selected******
******not selected******

et ca me cause un problem dans l'action!
Commenter la réponse de cs_biboobib
didoux95 845 Messages postés mardi 25 avril 2006Date d'inscription 1 août 2017 Dernière intervention - 4 mai 2008 à 10:45
0
Utile
Slt.
Ajoute le listener à chaque JCheckBox. Si tu dois faire plusieurs fois la même action, met ton code dans une méthode (genre "thingsToDo" ou qqc comme ca). Après, si les actions diffères suivant la checkbox (et son état), tu peux faire des testes conditionnels.
Commenter la réponse de didoux95
cs_biboobib 95 Messages postés dimanche 29 juillet 2007Date d'inscription 27 août 2011 Dernière intervention - 5 mai 2008 à 00:34
0
Utile
J'ai pas compris c 'est quoi "thingsToDo" ??

a propos je sai pas le nombre de ligne par chaque table.. donc je peu pas savoir le nombre de JCheckBox d'avance!!

j'ai la tét qui me fai mal a cause de ca!!
Commenter la réponse de cs_biboobib
didoux95 845 Messages postés mardi 25 avril 2006Date d'inscription 1 août 2017 Dernière intervention - 5 mai 2008 à 10:20
0
Utile
lool .. xD
Par exemple, tu créer une JCheckBox à laquelle tu ajoute un ChangeListener ou un ActionListener. Après, tu l'ajoute à ta JTable. Pour la méthode thingsToDo (que tu peux appler autrement :p) c'est la méthode dans laquelle tu vas mettre les choses à faire lorsqu'une JCheckBox à changé d'état (pour éviter d'avoir trente six million de fois le même bout de code ;o ). Tu peux par exemple y tester si elle est sélectionner, ..

Si ce qe tu veux c'est ajouter autant de checkbox que de case, utilise une boucle "for" dans laquelle tu créer puis ajoute ton composant ..
Commenter la réponse de didoux95
cs_biboobib 95 Messages postés dimanche 29 juillet 2007Date d'inscription 27 août 2011 Dernière intervention - 5 mai 2008 à 14:48
0
Utile
merci, dans ma class EachRowEditor (voir la class au dessus)  ,j'ai fai un seul JCheckBox dans une ligne! et puisque mes donneé provienneent d'une base de donnée je pe pas savoir le nombre de JCheckBox que j'ai , c'est pour ca je peu pas faire une ActionListener ou ChangeListener a chaque JCheckBox!!

 public void stateChanged(ChangeEvent evt) {
//box est le JCheckBox dans ma class de l'interface graphique de JTable
    if(evt.getSource()==box)
     {
       if (box.isSelected()){
    
// things to do
   }}
Commenter la réponse de cs_biboobib
didoux95 845 Messages postés mardi 25 avril 2006Date d'inscription 1 août 2017 Dernière intervention - 5 mai 2008 à 18:38
0
Utile
//Le vecteur das lequel tu as tes JCheckBox
Vector<JCheckBox> vBox = new Vector<JCheckBox>();

//Le modèle
JCheckBox model = null;

//Tu créer en boucle (tu dois forcément avoir un moyen de savoir le nombre de box que tu veux afficher .. nn?! )
for (int a=0; a<nbBox; a++) {
   model = new JCheckBox("Ma boîte n°" + a);
   model.addActionListener(new ActionListener() {
      public void actionPerformed (ActionEvent evt) {
         thingsToDo();
      }
   });
   vBox.add(model);
}

//Le vecteur permet juste de stocké les box créees et de, si tu as besoins, de les modifiées
//Ensuite tu fais une autre boucle dans laquelle tu ajoutes tes box créees dans ta JTable.



C'est une solution que j'utilises de temps à autre lorsque je veux permettre à l'utilisateur de faire un choix "non limité" (qui ne dépend pas du programme lui-même).
Commenter la réponse de didoux95

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.