【问题标题】:Vaadin Grid cell not showing multiline rowsVaadin Grid 单元格未显示多行行
【发布时间】:2016-07-09 12:07:06
【问题描述】:

使用 Vaadin Grid,我想为每个单元格生成多行单元格,这些单元格中的内容更多且与其宽度重叠。

我已经试过了:

  • java \n 换行符和 CSS 样式,如 white-space: pre;,但它似乎不起作用。 (此解决方案适用于 Table)

  • 自定义渲染器 setRenderer(HtmlRenderer)</br>tags 和不同的 CSS 显示设置

期望的结果:

【问题讨论】:

  • 更新:Vaadin Grid 2 带有“可变行高支持”vaadin.com/blog/-/blogs/… 目前还没有 Java API 支持它,但可能有替代方案:“使用 Vaadin Framework 8.0,我们包含了一个启用部分称为 HTML 导入的技术。这允许诸如 之类的 Web 组件与 Framework 8.0 一起使用。"

标签: java grid vaadin


【解决方案1】:

Vaadin Grid 仍然没有对多行列的原生支持,但您可以尝试一些即兴创作,例如我建议在链接上查看 Vaadin 论坛讨论: Grid - How to display multiple lines in one cell

您也可以尝试为 Grid 创建自定义渲染器。

【讨论】:

  • 感谢您的回答 Dragan。你能提供一些示例实现吗?
  • 见链接vaadin.com/docs/-/part/framework/components/… 建议尝试实现HtmlRenderer
  • 我已经这样做了,但是行没有垂直拉伸,所以在第一个
    之后没有显示任何内容。
  • 首先它看起来像是一个 Vaadin 错误。我认为您可以在 vaadin.com/bug 上将其记为错误。其次,您可以使用:vaadin.com/directory#!addon/componentrenderer 添加并在您的网格列中放置带有标签的 VerticalLayout。它比创建自己的渲染器更容易。但我认为创建自己的渲染器性能更高。
  • 感谢 Dragan 提供的解决方法。但我正在寻找本机实现。
【解决方案2】:

对于在列中具有大文本并且希望在网格列中显示大数据而不默认截断它们的人:

  1. 为您的网格添加样式名称:

    grid.addStyleName("commentsGrid");

  2. 如果您想自定义它们,请为您的行和单元格添加一些样式名称:

    grid.setRowStyleGenerator(rowRef -> {// Java 8
        return "bigRows";
    }); 
    

    grid.setCellStyleGenerator(new Grid.CellStyleGenerator(){
         @Override
         public String getStyle(CellReference cellReference) {
             return "bigCell";
         }
    });
    
  3. 对我来说,问题专栏是 cmets。所以用p标签包围文本,样式类wrap和固定宽度。

    Converter<String, String> commentsConverter = new Converter<String,  String>(){
            @Override
            public String convertToModel(String value, Class<? extends String> targetType, Locale locale)
                    throws com.vaadin.data.util.converter.Converter.ConversionException {
    
                return value;
            }
    
            @Override
            public String convertToPresentation(String value, Class<? extends String> targetType, Locale locale)
                    throws com.vaadin.data.util.converter.Converter.ConversionException {
                if(value !=null){
                    return "<p class=\"wrap\">"+value+"</p>";
                }else{
                    return "";
                }
            }
    
            @Override
            public Class<String> getModelType() {
                return String.class;
            }
    
            @Override
            public Class<String> getPresentationType() {
                return String.class;
            }
    
        };
        grid.getColumn("comments").setRenderer(new HtmlRenderer(), commentsConverter);
        grid.getColumn("comments").setWidth(700d);
    
  4. 然后我将上面提到的类设置如下:

    .commentsGrid td{
        height:150px !important;
     }
    
    p.wrap{
      width: 45em;
      word-wrap: break-word;
      word-break: break-all;
      white-space: normal; 
    }
    

我得到了这样的结果:

我不是 CSS 忍者,所以你可以让它比这更漂亮。

如果您不希望所有行都具有同样大的高度,那么您可以即时计算 rowHeights,然后在第 2 步中设置它们。我不是 100% 确定。

【讨论】:

    【解决方案3】:

    另一种将长滚动文本放入网格列的方法是为网格设置行高,并使用组件渲染器并在包含文本的网格中呈现文本区域。这很好用,因为如果文本太长,用户将在单元格内获得一个滚动条以查看溢出的文本。

    Column screen = grid.addComponentColumn(role->{
            TextArea ta = new TextArea();
            ta.setValue(VALUE_PROVIDER_TEXT);
            ta.setStyleName("clear");
            ta.setHeight("100px");
            ta.setReadOnly(true);
            ta.setWidth("150px");
            return ta;
        });
        screen.setWidth(150);
        screen.setCaption("Screens");
        grid.setBodyRowHeight(100);
    

    这在 css 中

      .v-textarea-clear{background-color: transparent;border: none;}
    

    Example

    【讨论】:

      【解决方案4】:

      您是否尝试将样式渲染器添加到您的 ceolumns 以添加自定义 css 类,您可以在其中放置您定义的高度?

      例子:

      Java:

      grid.setCellStyleGenerator(cellRef -> // Java 8
          "heigher");
      

      CSS:

      .v-grid-cell.heigher {
          height: 10em;
      }
      

      示例来自:https://vaadin.com/docs/-/part/framework/components/components-grid.html

      【讨论】:

      • 感谢您的回答。请查看更新后的问题。
      猜你喜欢
      • 1970-01-01
      • 2022-01-18
      • 2015-06-01
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 2017-08-31
      • 2018-04-05
      相关资源
      最近更新 更多