Listener de selection d'un checkBox dans une JTable

Résolu
cs_biboobib Messages postés 95 Date d'inscription dimanche 29 juillet 2007 Statut Membre Dernière intervention 27 août 2011 - 3 mai 2008 à 18:31
cs_biboobib Messages postés 95 Date d'inscription dimanche 29 juillet 2007 Statut Membre Dernière intervention 27 août 2011 - 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;
    }
  }
  }
A voir également:

9 réponses

cs_biboobib Messages postés 95 Date d'inscription dimanche 29 juillet 2007 Statut Membre Dernière intervention 27 août 2011 1
7 mai 2008 à 20:34
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!
3
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
3 mai 2008 à 18:46
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
   }
}

+
0
cs_biboobib Messages postés 95 Date d'inscription dimanche 29 juillet 2007 Statut Membre Dernière intervention 27 août 2011 1
4 mai 2008 à 00:06
oui, mais où j'ajoute le listener ? dans cette class ?
0
cs_biboobib Messages postés 95 Date d'inscription dimanche 29 juillet 2007 Statut Membre Dernière intervention 27 août 2011 1
4 mai 2008 à 00:29
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!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
4 mai 2008 à 10:45
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.
0
cs_biboobib Messages postés 95 Date d'inscription dimanche 29 juillet 2007 Statut Membre Dernière intervention 27 août 2011 1
5 mai 2008 à 00:34
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!!
0
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
5 mai 2008 à 10:20
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 ..
0
cs_biboobib Messages postés 95 Date d'inscription dimanche 29 juillet 2007 Statut Membre Dernière intervention 27 août 2011 1
5 mai 2008 à 14:48
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
   }}
0
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
5 mai 2008 à 18:38
//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).
0
Rejoignez-nous