2010-09-23 7 views
1

Je développe un JTable avec différentes lignes. Je voudrais associer un événement à la sélection d'une ligne dans ce tableau. Je l'ai utilisé la classe de sélection ci-dessous pour fournir un comportement à la sélection de table:problème lors de l'implémentation d'un écouteur de sélection dans un JTable

public class TableSelectionListener implements ListSelectionListener{ 

public Integer item;  

public TableSelectionListener(Integer item){ 
    this.dialog = item; 
} 

public void valueChanged(ListSelectionEvent e) { 

    System.out.println("The row clicked is "+item); 

    } 
} 

Lorsque je crée une instance de ce tableau, sai tabletest, j'ai ajouté le morceau de code suivant:

tabletest.getSelectionModel().addListSelectionListener(new TableSelectionListener(tabletest.getSelectedRow()); 

Le problème est que lorsque je clique sur une ligne une fois, au lieu de récupérer le message associé une fois, je récupère le même message plusieurs fois, ce qui suggère que les actions répétées plusieurs fois. Par exemple:

The row clicked is 0 
The row clicked is 0 
The row clicked is 0 
The row clicked is 0 

Est-ce que quelqu'un sait où le problème peut être?

Répondre

4

Eh bien, c'est juste normal.

Votre liste d'écoute de sélection est créée avec la valeur tabletest.getSelectedRow() à sa table de création (zéro). Et comme vous ne modifiez jamais la valeur de item dans votre programme d'écoute, cet écouteur ne peut afficher que 0.

Si je devais vous, je wouold remplacer la méthode valueChanged() par quelque chose comme (bien qu'il soit non testé et je me souviens des choses étranges arrive parfois quand on mélange vue et les valeurs de ligne modèle) ceci:

public void valueChanged(ListSelectionEvent e) { 
    if(!e.getValueIsAdjusting()) // added as sometimes, multiple events are fired while selection changes 
     System.out.println("The row clicked is "+e.getFirstIndex()); 
} 
+0

Eh bien, ça ne fonctionne pas: si je clique sur le deuxième et troisième ligne la sortie de message est correct: « La ligne sélectionnée est 1 » et "La ligne cliquée est 2". Cependant quand je clique sur la première rangée au lieu de me donner 0 cela me donne encore 2. – Anto

+0

L'approche alternative serait de demander à l'auditeur de la table quelles lignes ont été choisies. – Carlos

+4

'e.getFirstIndex()' n'est pas très fiable. utilisez table.getSelectedRow() - c'est plus stable. –

4

Tout d'abord, il est parfaitement normal pour obtenir plusieurs ListSelectionEvent s, pendant que la sélection est en cours de modification. Vous pouvez utiliser la méthode getValueIsAdjusting pour déterminer quand la sélection est terminée (elle renverra false).

Deuxièmement, il n'est pas nécessaire de construire votre TableSelectionListener avec un numéro de ligne. Lorsque votre méthode valueChanged est appelée, vous pouvez obtenir l'index de la première/dernière ligne sélectionnée (souvenez-vous qu'il est possible de sélectionner plusieurs lignes dans le tableau, sauf si vous le désactivez) en utilisant e.getFirstIndex() et e.getLastIndex() respectivement.

2

Un moyen plus facile de le faire, est la suivante:

table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { 
    @Override 
    public void valueChanged(ListSelectionEvent e) { 
     System.out.println("e...."+table.getSelectedRow()); 
    } 
}); 
+0

le prix que vous payez pour cette simplicité ressentie est le couplage de l'auditeur à la table - généralement pas ce que vous voulez. De plus, vous avez oublié la vérification de isAdjusting: typiquement, vous voulez ignorer de tels événements. – kleopatra