2017-10-09 4 views
0

J'ai un SWT Table avec plusieurs colonnes. Dans cet exemple, disons qu'il y a trois colonnes. Les cellules de chaque colonne contiennent toutes une image suivie d'un texte (exemple illustré ci-dessous). Cependant, comme vous pouvez le voir, il n'y a pas d'espacement entre les 2 - 3 lignes de colonnes et leurs cellules.SWT Déport/remplissage de colonne de table

Existe-t-il un moyen intégré pour ajouter une zone tampon à ces cellules afin que les icônes n'apparaissent pas correctement sur la ligne de bord? Comme une propriété de compensation d'une sorte? Je ne vois aucune propriété ouvertement répertoriée dans Table ou TableColumn.

Si ce n'est pas le cas, existe-t-il une solution de contournement au-delà de l'ajout d'espace blanc aux images de la cellule?

Veuillez me faire savoir s'il y a quelque chose que je peux faire pour clarifier ma question.

Tableau:

table

Répondre

2

Je ne pense pas qu'il y ait un moyen désigné pour ajuster la marge et l'espacement de l'image et du texte dans une cellule. En plus d'ajouter des pixels transparents à l'image (comme vous l'avez déjà suggéré), vous pouvez utiliser un PaintListener pour prendre le contrôle du rendu d'une cellule.

L'exemple ci-dessous dessine l'image et du texte avec une marge réglable et espacement:

Listener paintListener = new Listener() { 
    int leftMargin = 40; 
    int rightMargin = 10; 
    int imageSpacing = 200; 
    @Override 
    public void handleEvent(Event event) { 
    TableItem item = (TableItem)event.item; 
    Rectangle imageBounds = image.getBounds(); 
    Point textExtent = event.gc.textExtent(item.getText()); 
    switch(event.type) { 
     case SWT.MeasureItem: { 
     event.width += leftMargin + imageBounds.width + imageSpacing + textExtent.x + rightMargin; 
     event.height = Math.max(event.height, imageBounds.height + 2); 
     event.height = Math.max(event.height, textExtent.y + 2); 
     break; 
     } 
     case SWT.PaintItem: { 
     int x = event.x + leftMargin; 
     int imageOffset = (event.height - imageBounds.height)/2; 
     event.gc.drawImage(image, x, event.y + imageOffset); 
     x += imageSpacing; 
     int textOffset = (event.height - textExtent.y)/2; 
     event.gc.drawText(item.getText(), x, event.y + textOffset); 
     break; 
     } 
     case SWT.EraseItem: { 
     event.detail &= ~SWT.FOREGROUND; 
     } 
    } 
    } 
}; 
table.addListener(SWT.MeasureItem, paintListener); 
table.addListener(SWT.PaintItem, paintListener); 
table.addListener(SWT.EraseItem, paintListener); 

Pour une analyse plus approfondie des éléments de compréhension owner-drawn dans SWT s'il vous plaît lire l'article Custom Drawing Table and Tree Items.

Si vous utilisez un JFace TableViewer, il y a aussi un OwnerDrawLabelProvider comme indiqué dans cet exemple: http://www.vogella.com/tutorials/EclipseJFaceTableAdvanced/article.html#styledcelllabelprovider-and-ownerdrawlabelprovider

+0

Malheureusement, je ne suis pas à l'aide d'un JFace TableViewer et les spécifications de conception me empêchent de placer les images à la côté droit de la cellule. Il semble que ma meilleure option est d'insérer des pixels transparents à gauche de l'image. J'ai cherché un moyen de le faire avec GC sans créer de poignées supplémentaires (certains exemples montrent l'utilisation d'une image transparente temporaire). Connaissez-vous par hasard un moyen ou un lien vers un bon problème? – Sarah

+0

Vous n'avez pas besoin d'utiliser JFace, un simple 'PaintListener' le fera aussi. L'extrait SWT lié est juste un exemple que vous pouvez utiliser comme point de départ pour apprendre à positionner une image. –