Improve Foudations Improve Technologies Improve Community Improve Institute

Checkboxes dans une table SWT

Comment mettre des checkboxes dans une table SWT ? Plusieurs solutions se présentent...


En standard

La table SWT n’accepte les checkboxes que dans sa première colonne.

Pour activer ce comportement, on utilise le style SWT.CHECK.

new Table(parent, SWT.CHECK);

Cette checkbox a cependant un comportement particulier et l’action de la cocher n’est qu’une alternative à la sélection de ligne.

En conséquence, c’est un SelectionListener qui pourra intercepter les changements d’état :

table.addSelectionListener(new SelectionAdapter() {
	public void widgetSelected(SelectionEvent e) {
		if (e.detail == SWT.CHECK) {
			...
		}
	}
});

En résumé, cette façon de procéder est assez simple à mettre en oeuvre mais ne permet pas d’avoir des cases à cocher dans plusieurs colonnes distinctes qui, par exemple, correspondraient à des booléens sur des beans.

Avec JFace

On peut simuler la présence de checkboxes dans un TableViewer.

Pour cela, on implémente ICellModifier (voir cet article sur l'utilisation de TableViewer) et on fera en sorte que le LabelProvider retourne une image qui corresponde selon les cas à la case cochée ou décochée.

Cette approche comporte quelques limitations :

  • on n’obtient pas l’aspect habituel d’une checkbox puisque ce ne sont que des images
  • si la table doit afficher d’autres images, celles correspondant aux cases à cocher risquent de ne pas être de la bonne taille (car malheureusement, dans une table SWT, toutes les images sont de la taille de la première image insérée)

TableEditor

Utiliser TableEditor permet d’ajouter une véritable checkbox (bouton de style check) aux cellules de son choix.

TableEditor editor = new TableEditor(table);
editor.grabVertical = false;
editor.minimumHeight = 18;
Button button = new Button(table, SWT.CHECK);
button.pack();
editor.horizontalAlignment = SWT.CENTER;
editor.minimumWidth = button.getSize().x;
editor.setEditor(button, item, colIndex);

où item est le TableItem qui correspond à la ligne et colIndex est l’indice de la colonne.

Pour traiter les changements d’état :

button.addSelectionListener(new SelectionAdapter() {
	public void widgetSelected(SelectionEvent e) {
		Button checkBox = (Button) e.getSource();
		boolean selected = checkBox.getSelection();
		...
	}
});

On peut procéder de la même manière pour mettre en oeuvre des boutons radio.

 
moni/trucs/checkboxes_tables_swt.txt · Last modified: 2006/02/23 10:15 by fesnault