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 :

écoute de touches, de double clics sur un JTable


Sujet :

Composants Java

  1. #1
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 57
    Points : 43
    Points
    43
    Par défaut écoute de touches, de double clics sur un JTable
    Re-bonjour à tous!
    J'ai grand besoin de conseils ou du moins d'idées qui me donneront une bonne base pour réfléchir.



    Mon problème:
    Dans une interface graphique, j'ai une JTable qui a pour model TableSorter (celui qui est fourni dans le tutorial de Sun, c'est un Model qui permet le tri en fonction des colonnes, par des clics sur les TableHeaders), qui est associé à un model que j'ai conçu ("data" est une ArrayList d'objets dont les champs composent les colonnes). Je voudrais rendre mon JTable sensible à plusieurs actions:

    -double-clic sur une row: j'aimerais dans ce cas afficher une fenêtre contenant des informations sur l'objet associé à cette row. Je pense utiliser la méthode getClickCount() de MouseEvent (pour compter le nombre de clics consécutifs), mais je ne sais pas à quel objet faire un addMouseListener(). Peut-être puis-je désigner une row en tant qu'objet, y ajouter mon MouseListener, mais comment?

    -Je voudrais que, une fois que plusieurs rows sont sélectionnées (un ou plusieurs, contigus ou non), un appui sur la touche suppr permette d'effacer ces lignes et en même temps supprime les objets correspondants dans ma ArrayList data. Problème, je ne sais toujours pas à quels objets ajouter un KeyListener, et je ne sais pas comment récupérer la liste des rows sélectionnées (en fait mon grand problème est que je ne sais pas manipuler une row, la méthode getSelectedRow renvoie un entier!!!).

    -Enfin, j'ai besoin d'un champ de texte éditable, qui engendrerait des réactions à chaque modification de son contenu (effacement, rajout d'un caractère...) sans que l'utilisateur ait à valider quoi que ce soit. J'ai pensé utilisé JTextField et un TextListener, mais les TextListener ne peuvent être utilisés que par TextField, qui est AWT, or j'ai vu dans le FAQ qu'il ne faut pas mélanger swing et awt. J'utilise donc ActionListener avec JTextField, mais dans ce cas l'utilisateur doit taper sur la touche "entrée" pour qu'une modification soit prise en compte, ce qui ne m'arrange pas. Y-a-ti une autre solution?

    Quelqu'un pourrait-il m'aider???

  2. #2
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 57
    Points : 43
    Points
    43
    Par défaut
    Pour le JTextField c'est bon! J'ai trouvé sur le forum un problème similaire, j'utilise un CaretListener et ça marche
    par contre si quelqu'un peut m'aider pour les 2 premières questions...

  3. #3
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Il faut ajouter le mouseListener sur ta JTable et ensuite, tu utilises getSelectedColumn(), getSelectedRow() ou getSelectedRows() pour savoir ou est ce que l'on a cliqué.

    Ensuite, tu peut employer la méthode getValueAt pour savoir quelle est la valeur de la cellule et setValueAt pour la modifier.

  4. #4
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 57
    Points : 43
    Points
    43
    Par défaut
    Okay merci. Je vais tester ça et je te dirai si ça marche.

  5. #5
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 57
    Points : 43
    Points
    43
    Par défaut
    Alors j'ai essayé ta méthode, ça marche presque en fait. A un gros détail près: quand j'effectue une sélection puis suppression d'une ligne après avoir effectué un reclassement de ma liste en Live (par exemple, en cliquant sur la colonne titre, je passe en classement alphabétique décroissant en fonction du titre), la méthode getSelectedRow() me renvoie l'indice qui correspond à l'élément de ma liste qui était dans la ligne ou j'ai cliqué AVANT reclassage.

    Pour être plus clair, voici le code de la classe que j'utilise comme 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
     
    import javax.swing.*; 
    import java.util.*;
     
    class TableauResultats extends JTable {
      //avec cette classe nous disposons des fonctionnalités de JTable, plus une fonction qui nous renvoit la ArrayList contenant les éléments affichés
     
      public TableauResultats(ArrayList<ElementDeLHolotheque> data) {
        super(new TableSorter(new TableauResultatsModel(data)));
        getTableHeader().setToolTipText("Cliquer pour modifier le critère de classement des éléments.");    
        sorter = (TableSorter) this.getModel();
        trm = (TableauResultatsModel) sorter.getTableModel();
        sorter.setTableHeader(getTableHeader());
      }
     
     
     
      public ArrayList<ElementDeLHolotheque> getListe() {
        return trm.getData();
      }
     
      public TableauResultatsModel getMonModel() {
        return trm;
      }
     
     
      TableSorter sorter;
      TableauResultatsModel trm;
    }
    (la classe JSorter est fournie dans le Tutorial de Sun sur les JTable)

    Et j'ai codé la suppression d'une ligne dans ma classe principale de cette façon:

    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
     
    public void keyReleased(KeyEvent e) {
        if (e.getKeyCode()==KeyEvent.VK_DELETE) {
          int ind = tableau.getSelectedRowCount();
          switch (ind) {
            case 0: { System.out.println("Vous devez sélectionner un ou plusieurs éléments de l'holothèque pour pouvoir les supprimer"); break; }
            case 1: {
              if (JOptionPane.showConfirmDialog(this, "Voulez-vous vraiment supprimer cet élément de l'holothèque?")==JOptionPane.YES_OPTION) {
                ArrayList<ElementDeLHolotheque> holotheque = tableau.getListe();
                System.out.println("Vous allez supprimer: "+((ElementDeLHolotheque) holotheque.get(tableau.getSelectedRow())));
                holotheque.remove(tableau.getSelectedRow());
                // cette méthode met à jour le fichier Holotheque.xml en retirant l'élément qui vient supprimé
                NouvelElement.miseAJourFichier(holotheque, nomDossier);
                (tableau.getMonModel()).fireTableRowsDeleted(ind, ind);
              }
              break;
            }
            case 2: { // je m'en occuperai plus tard
            }
          }
        }
      }
    Enfin, voici le modèle que j'utlise (en coordination avec TableSorter):

    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
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.AbstractTableModel;
    import java.awt.Dimension;
    import java.awt.GridLayout;
    import java.util.*;
     
     
     
    class TableauResultatsModel extends AbstractTableModel {
     
            private String[] columnNames = {"Titre", "Type", "Lieu de rangement", "Emprunteur"};
     
     
            private ArrayList<ElementDeLHolotheque> data;
     
            public TableauResultatsModel(ArrayList<ElementDeLHolotheque> data) {
              this.data = data;
            }
     
     
            public int getColumnCount() {
                return columnNames.length;
            }
     
            public ArrayList<ElementDeLHolotheque> getData() {
              return data;
            }
     
            public int getRowCount() {
                return data.size();
            }
     
            public String getColumnName(int col) {
                return columnNames[col];
            }
     
            public Object getValueAt(int row, int col) {
                ElementDeLHolotheque elem = (ElementDeLHolotheque) data.get(row);
                String resultat = null;
                switch (col) {
                  case 0: {resultat = elem.getTitre(); break;}
                  case 1: {resultat = elem.getType(); break;}
                  case 2: {resultat = elem.getLieu(); break;}
                  case 3: {resultat = elem.getEmprunteur(); }
                }
                return resultat;
            }
     
               }
    Voilà, si quelqu'un peut m'aider ce serait super!

  6. #6
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Ca je sais pas trop comment résoudre, j'ai jamais utilisé JTable avec JSorter, mais par contre, je l'ai fait avec une JXTable qui permet de faire du tri par défaut, et elle contient des méthodes pour convertir l'index affiché en l'index correspondant au modèle.

    Vérifique que tu n'as pas quelque chose du genre dans ton JSorter...

  7. #7
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 57
    Points : 43
    Points
    43
    Par défaut
    OUF! ça y est :-)
    effectivement TableSorter dispose d'une telle méthode, le tableau de correspondances est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int[] getModelToView();
    il m'a suffit de rendre public cette méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    private int[] getModelToView() {
            if (modelToView == null) {
                int n = getViewToModel().length;
                modelToView = new int[n];
                for (int i = 0; i < n; i++) {
                    modelToView[modelIndex(i)] = i;
                }
            }
            return modelToView;
        }
    et dans mon code j'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int[] correspondances = (tableau.getSorter()).getCorrespondances();
                int indiceCorrect = correspondances[tableau.getSelectedRow()];
    Merci pour tes idées! Quand à moi je vais pouvoir aller dormir

  8. #8
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 57
    Points : 43
    Points
    43
    Par défaut
    erreur de ma part en fait, pour que ça marche parfaitement il faut utiliser une méthode déjà prévue dans TableSorter:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public int modelIndex(int viewIndex) {
            return getViewToModel()[viewIndex].modelIndex;
        }
    et après je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int indiceCorrect = (tableau.getSorter()).modelIndex(tableau.getSelectedRow());
    voilà
    (avec ma solution précédente cela ne fonctionnait pas si on enchainait plusieurs tris)

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

Discussions similaires

  1. évènement double-clic sur une JTable
    Par casho dans le forum Général Java
    Réponses: 2
    Dernier message: 16/12/2009, 11h15
  2. ouverture d'un programme par double clic sur un fichier
    Par zieg18 dans le forum Visual C++
    Réponses: 6
    Dernier message: 12/07/2006, 10h02
  3. Double clic sur une feuille de données
    Par louroulou dans le forum Access
    Réponses: 7
    Dernier message: 14/06/2006, 11h33
  4. Réponses: 5
    Dernier message: 08/06/2006, 16h11
  5. comment autoriser le double clic sur un champ desactivé ?
    Par linou dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 28/04/2005, 17h23

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