2017-10-11 7 views
2

Je souhaite afficher les images miniatures dans une grille.Vaadin 8.2.0: Comment aligner verticalement l'image dans la cellule

Ceci est mon code approprié (simplifié):

addColumnVisibilityChangeListener(event -> { 
    if (ID_THUMBNAIL.equals(event.getColumn().getId())) { 
     if (event.isHidden()) { 
      setBodyRowHeight(-1); 
     } else { 
      setBodyRowHeight(130); 
     } 
     // needed to force rendering of current values 
     getDataProvider().refreshAll(); 
    } 
}); 
// rescale returns a (cached) ExternalResource, image is 120x120px max 
// aspect ratio is preserved, so at least width or height is 120px 
grid.addColumn(this::rescale, new ImageRenderer<>(this::showImage)) 
    .setCaption(ID_THUMBNAIL) 
    .setStyleGenerator(r -> ID_THUMBNAIL) 
    .setWidth(131); 

Le CSS est:

.asset-grid td.thumbnail { 
    // height is set bij Vaadin Grid 
    padding: 5px; 
    text-align: center !important;  
} 
.asset-grid td.thumbnail img { 
    vertical-align: middle !important; 
} 

Tout fonctionne, sauf l'alignement vertical de l'image miniature. Il est affiché en haut de la cellule. J'ai essayé plusieurs paramètres, mais rien ne fonctionne.

+0

Avez-vous essayé annonce d: "affichage: table-cellule; "à .asset-grille td.thumbnail? – 1011sophie

+0

Juste essayé, pas de différence – rmuller

+0

J'ai quelques solutions de contournement de travail, mais il dépeend sur la façon dont vous définissez la hauteur de la ligne.Il serait donc utile si vous pouviez fournir un [sscce] (http://sscce.org) afin que nous puissions prendre en compte tous les éléments – Morfic

Répondre

2

Ceci est basé principalement sur this answer on how to vertical-align image in div avec quelques variations mineures par essais et erreurs.

Il est possible d'utiliser la réponse d'origine avec un fixed line-size (par exemple 130) et vertical-align: middle, mais la version mise à jour offre une flexibilité quelle que soit la hauteur que vous définissez (testé en chrome et bord).

code:

import com.vaadin.event.ShortcutAction; 
import com.vaadin.server.ExternalResource; 
import com.vaadin.server.Resource; 
import com.vaadin.ui.*; 
import com.vaadin.ui.renderers.ClickableRenderer; 
import com.vaadin.ui.renderers.ImageRenderer; 

public class GridWithImages extends VerticalLayout { 

    public GridWithImages() { 
     // basic grid setup 
     Grid<User> grid = new Grid<>(); 
     grid.addColumn(User::getId) 
      .setCaption("Id"); 
     Grid.Column<User, Resource> thumbnailColumn = grid.addColumn(User::getThumbnail) 
                  .setCaption("Thumbnail") 
                  .setRenderer(new ImageRenderer<>(this::showImage)) 
                  .setStyleGenerator(r -> "thumbnail") 
                  .setWidth(131); 
     grid.setItems(new User(1), new User(2), new User(3)); 
     grid.setBodyRowHeight(130); 

     // allow to easily update height and width for testing purposes 
     TextField rowHeightField = new TextField("Row height", "130"); 
     TextField thumbnailColumnWidthField = new TextField("Thumbnail width", "131"); 
     Button button = new Button("Update", event -> { 
      // NOT SAFE, NOT ELEGANT, but for the sake of brevity just use those values... 
      grid.setBodyRowHeight(Integer.valueOf(rowHeightField.getValue())); 
      thumbnailColumn.setWidth(Integer.valueOf(thumbnailColumnWidthField.getValue())); 
     }); 
     button.setClickShortcut(ShortcutAction.KeyCode.ENTER); 

     addComponents(grid, rowHeightField, thumbnailColumnWidthField, button); 
    } 

    // image renderer click handler 
    private void showImage(ClickableRenderer.RendererClickEvent<User> event) { 
     Notification.show("This will be the actual image in full size... maybe, maybe not!"); 
    } 

    // basic bean for easy binding 
    private class User { 
     private int id; 
     private Resource thumbnail = new ExternalResource("https://www.gravatar.com/avatar/d9269818df2a058ad6bf9dbbaf1e8240?s=32&d=identicon&r=PG"); 

     public User(int id) { 
      this.id = id; 
     } 

     public int getId() { 
      return id; 
     } 

     public void setId(int id) { 
      this.id = id; 
     } 

     public Resource getThumbnail() { 
      return thumbnail; 
     } 

     public void setThumbnail(Resource thumbnail) { 
      this.thumbnail = thumbnail; 
     } 
    } 
} 

Thème:

td.v-grid-cell.thumbnail > img { 
    vertical-align: unset; // leaving it centered as inherited, shifts the image a few pixels downwards 
    position: relative; 
    left: 50%; 
    top: 50%; 
    transform: translate(-50%, -50%); // https://stackoverflow.com/questions/34551381/is-the-css3-transform-translate-percentage-values-relative-to-its-width-and-or-h 
} 

Résultat:

vaadin center image in grid

+0

Chapeau! question de CSS Merci pour tout le temps que vous investissez pour répondre à ces questions e questions Vraiment apprécié! – rmuller

+0

@rmuller De rien, c'est ce que nous faisons. Aussi oui, à peu près CSS. – Morfic