2017-10-11 9 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; ".asset-grid td.thumbnail? – 1011sophie

+0

ちょうど試してみましたが、違いはありません – rmuller

+0

私はいくつかの回避策を講じていますが、行の高さをどのように設定しているのかは分かりませんので、[sscce]私たちはすべての要素を考慮に入れることができます。 – Morfic

答えて

2

これは、主にthis answer on how to vertical-align image in divに基づいており、試行錯誤によって若干のバリエーションがあります。

元の回答はfixed line-size(例:130)とvertical-align: middleですが、更新されたバージョンでは設定した高さ(クロムとエッジでテスト済み)に関係なく柔軟性があります。

コード:

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の問題です。いつもお返事いただきありがとうございます。 eの質問。本当に感謝! – rmuller

+0

@rmullerあなたは大歓迎です、それはまさにSOのことです。また、はい、かなりCSS関連。 – Morfic

関連する問題