Cela pourrait paraître enfantin et
pourtant, on peut plutôt y perdre quelques cheveux!! Attention, je parle
pas ici des JTable de swing qui sont facilement utilisables et
extensibles, mais bien de l’objet simpliste Table de SWT.
Le principe basique des Tables est
d’afficher une liste de données en ligne (les colonnes représentent les
attributs). Le constructeur de l’objet permet facilement d’autoriser la
sélection d’une ligne entière, mais rien ne permet d’activer à l’aide de
la souris la sélection d’une cellule : il faut pour cela un peu
d’imagination. Jetons d’abord un œil au code avant de le commenter :
TableViewer tableViewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
| SWT.V_SCROLL | SWT.FULL_SELECTION);
tableViewer.getTable().addListener(SWT.MouseDown, new Listener() {
TableItem item = null;
int oldi = -1;
public void handleEvent(Event event) {
Point pt = new Point(event.x, event.y);
if (item != null && !item.isDisposed()) {
item.setBackground(oldi, Display.getCurrent()
.getSystemColor(SWT.COLOR_WHITE));
item.setForeground(oldi, Display.getCurrent()
.getSystemColor(SWT.COLOR_BLACK));
}
item = table.getItem(pt);
if (item == null)
return;
for (int i = 0; i < table.getColumnCount(); i++) {
Rectangle rect = item.getBounds(i);
if (rect.contains(pt)) {
table.deselectAll();
item.setBackground(i, Display.getCurrent()
.getSystemColor(SWT.COLOR_LIST_SELECTION));
item.setForeground(i, Display.getCurrent()
.getSystemColor(SWT.COLOR_WHITE));
oldi = i;
int index = table.indexOf(item);
System.out.println("Sélection de la ligne " + index + " - colonne " + i + " : valeur '"+ item.getText(i) +"'");
}
}
}
});
}
Le principe est donc le suivant :
Lorsque l’utilisateur clic dans le
tableau, on récupère la position x et y du clic et on lui demande de
nous retourner l’élément situé sous la souris (l’objet item). Pas
terrible n’est-ce pas?!
Au niveau du code on a donc bien
récupéré notre objet, mais au niveau visuel, c’est toute la ligne du
tableau qui est sélectionnée! Pour y remédier, on dé-sélectionne
immédiatement tout, puis on affecte à notre cellule une couleur
d’arrière-plan correspondant à la couleur d’un élément sélectionné… On
garde en mémoire notre cellule pour lui redonner des couleurs normales
lorsqu’une autre sera clicquée.
Je vous l’accorde, c’est du bricolage,
mais l’objet Table de SWT est vraiment très basique et c’est le seul
moyen d’arriver à ce résultat ( à moins que je ne me trompe…)
Fichier(s) joint(s) :