2017-10-11 57 views
2

我想在网格中显示缩略图图像。Vaadin 8.2.0:如何垂直对齐网格单元格中的图像

这是我的相关代码(简化):

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); 

的CSS是:

.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; 
} 

一切正常,除了缩略图的垂直对齐方式。它显示在单元格的顶部。我尝试了几个设置,但没有任何工作。

+0

你有没有尝试广告d:“display:table-cell; “to .asset-grid td.thumbnail? – 1011sophie

+0

刚刚尝试过,没有什么区别 – rmuller

+0

我有一些工作解决方法,但是它取决于你如何设置行高,所以如果你可以提供[sscce] (http://sscce.org),所以我们可以考虑所有的元素 – Morfic

回答

2

这主要基于this answer on how to vertical-align image in div,并通过试验和错误进行了一些细微的变化。

可以使用原始答案与fixed line-size(例如130)和vertical-align: middle,但更新后的版本提供了灵活性,无论您设置了多大的高度(在Chrome和边缘进行测试)。

代码:

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; 
     } 
    } 
} 

主题:

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 
} 

结果:

vaadin center image in grid

+0

帽子掉了!所以它只是一个关于CSS的问题。感谢您一直投资回答这些问题问题。非常感谢! – rmuller

+0

@rmuller不客气,这就是所有关于。也是,很多CSS相关。 – Morfic

相关问题