6
votes

Comment aligner l'image au centre de la cellule de table (table SWT)

Je développe l'application Eclipse RCP et j'ai un problème avec une table . Nous avons des données dans la base de données au format booléen et les utilisateurs souhaitent voir ce champ à l'aide de la case à cocher .

J'ai essayé de le mettre en œuvre à l'aide de la touche (swt.check) comme éditeur de table , mais cela a fonctionné trop lentement: (

J'ai essayé d'utiliser 2 images cochées et cochées et décochées, cela fonctionne, mais je ne peux pas les aligner au centre, ils sont alignés sur la gauche automatiquement.

J'ai même trouvé comment attraper swt.measureItem et swt.paintitem events et processus manuellement par modification event.x champ, mais J'ai eu un problème - je ne peux pas obtenir quelle colonne mesurant ou peindre pour le moment, car l'événement ne me fournit pas cette information.

Est-ce le seul moyen d'aligner les images de centrer en modifiant les données d'événement sur redessinant ou peut-être exister d'autres moyens de représenter des données booléennes via des cases à coffrets? Je n'ai pas besoin de les éditer maintenant, alors le mode lecture seule devrait suffire.


2 commentaires

Je suis en quelque sorte choqué que laisser les cases à cocher du système d'exploitation sont plus lentes que de dessiner vos propres images.


@Edwardthomson Je pense que cela dépend vraiment de la mise en œuvre ..


4 Réponses :


9
votes

Vous pouvez ajouter paintlistener à votre table et quand il peindra la colonne sélectionnée (colonne 5 dans mon cas), vérifiez la taille de la ligne et alignez l'image par vous-même. XXX < / pré>


0 commentaires

0
votes

Vous pouvez également consulter cette entrée de blog: Catégories de tableViewers et Natuelooking .


0 commentaires

2
votes

Voici l'exemple en utilisant OwnerDrawLabelProvider: http://bingjava.appspot.com/snippet .jsp? id = 3221

Je l'ai combinée avec le lien de Tony à TableViewers et catégories de Natuelooking et créé Abstrait pratique CentredCheckboxBoxLabelProvider Class P>

import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.OwnerDrawLabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TableItem;

public abstract class CenteredCheckboxLabelProvider extends OwnerDrawLabelProvider {
    private static final String CHECKED_KEY = "CHECKED";
    private static final String UNCHECK_KEY = "UNCHECKED";

    public CenteredCheckboxLabelProvider(ColumnViewer viewer) {
        if (JFaceResources.getImageRegistry().getDescriptor(CHECKED_KEY) == null) {
            JFaceResources.getImageRegistry().put(UNCHECK_KEY, makeShot(viewer.getControl().getShell(), false));
            JFaceResources.getImageRegistry().put(CHECKED_KEY, makeShot(viewer.getControl().getShell(), true));
        }
    }

    private Image makeShot(Shell shell, boolean type) {
        Shell s = new Shell(shell, SWT.NO_TRIM);
        Button b = new Button(s, SWT.CHECK);
        b.setSelection(type);
        Point bsize = b.computeSize(SWT.DEFAULT, SWT.DEFAULT);
        b.setSize(bsize);
        b.setLocation(0, 0);
        s.setSize(bsize);
        s.open();

        GC gc = new GC(b);
        Image image = new Image(shell.getDisplay(), bsize.x, bsize.y);
        gc.copyArea(image, 0, 0);
        gc.dispose();

        s.close();

        return image;
    }

    public Image getImage(Object element) {
        if (isChecked(element)) {
            return JFaceResources.getImageRegistry().get(CHECKED_KEY);
        } else {
            return JFaceResources.getImageRegistry().get(UNCHECK_KEY);
        }
    }

    @Override
    protected void measure(Event event, Object element) {
    }

    @Override
    protected void paint(Event event, Object element) {
        Image img = getImage(element);

        if (img != null) {
            Rectangle bounds = ((TableItem) event.item).getBounds(event.index);
            Rectangle imgBounds = img.getBounds();
            bounds.width /= 2;
            bounds.width -= imgBounds.width / 2;
            bounds.height /= 2;
            bounds.height -= imgBounds.height / 2;

            int x = bounds.width > 0 ? bounds.x + bounds.width : bounds.x;
            int y = bounds.height > 0 ? bounds.y + bounds.height : bounds.y;

            event.gc.drawImage(img, x, y);
        }
    }

    protected abstract boolean isChecked(Object element);
}


2 commentaires

Glorieux, merci beaucoup! Je devais juste faire un petit changement: j'utilise un arbreviewer, de sorte que les articles d'événements sont TreeItem au lieu de la TableItem; Je viens d'utiliser l'instanceOf pour qu'il fonctionne avec les deux cas.


Ouch, j'ai parlé trop tôt ... eu des problèmes avec la couleur d'arrière-plan de l'état sélectionné, c'était différent de toutes les autres cellules de la même rangée et semblait laid. J'ai essayé beaucoup de choses mais n'avait pas été capable de le réparer. -_- J'ai fini par utiliser la solution de sorcier.



0
votes

La solution du sorcier est arrivée utile. Je l'ai adapté à une personnalisation istyledlabelProvider à utiliser dans un mode de délégationStyleDCellLabelProvider: xxx

Notez que j'utilise Imarker comme des données pour les éléments et un arbreViewer (donc je reçois des arbres) , mais vos données peuvent différer et votre visualiseur pourrait être un site de table; Il vous suffit de faire vos propres ajustements.


0 commentaires