当前位置: 首页 > 知识库问答 >
问题:

在Vaadin网格中添加子标题行/汇总行

麻鸿熙
2023-03-14

是否可以将汇总行添加到Vaadin网格中?

我目前有一个网格,它有一个标题行来连接列,并在顶部提供了一个良好的概述。但是,我想在整个网格中添加类似的标题,以便标记一节的结束。似乎只能在header部分添加header,这将简单地填充网格的头部。页脚在底部也会这样做。

但是,如果我希望在网格中有一个特殊的行,而不必创建新的网格组件,该怎么办?一个可视的数据分隔符。

共有1个答案

呼延靖
2023-03-14

根据你需要什么以及你的应用程序有多复杂,你可以用一些(可能很小的)努力来伪造一些东西。你可以在下面找到一个简单的例子,它应该让你开始。

1)与BeanItemContainer一起使用的公共类,用于显示两个类别的行

public abstract class Row {
    private String name;
    private int amount;

    public Row(String name, int amount) {
        this.name = name;
        this.amount = amount;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAmount() {
        return amount;
    }

    public void setAmount(int amount) {
        this.amount = amount;
    }

    // provide a custom style/type for the current row
    public abstract String getRowType();
}

2)常规产品行

public class ProductRow extends Row {
    public ProductRow(String name, int amount) {
        super(name, amount);
    }

    @Override
    public String getRowType() {
        return "product-row";
    }
}

3) 显示上一批产品总数的特殊行

public class TotalRow extends Row {
    public TotalRow(int sum) {
        super("Total", sum);
    }

    @Override
    public String getRowType() {
        return "total-row";
    }
}

4) 网格本身

public class GridWithIntermediateRowsComponent extends VerticalLayout {
    private static final String[] AVAILABLE_PRODUCTS = new String[]{"Banana", "Apple", "Coconut", "Pineapple", "Melon"};
    private Random random = new Random();

    public GridWithIntermediateRowsComponent() {
        BeanItemContainer<Row> container = new BeanItemContainer<>(Row.class);
        Grid grid = new Grid(container);

        // show only the relevant columns, the style one is used only to change the background
        grid.setColumns("name", "amount");

        // set a style generator so we can draw the "total" rows differently
        grid.setCellStyleGenerator(row -> ((Row) row.getItemId()).getRowType());

        // create some dummy data to display
        for (int i = 0; i < random.nextInt(10) + 1; i++) {
            container.addAll(createItemBatch(random.nextInt(5) + 1));
        }

        addComponent(grid);
    }

    private List<Row> createItemBatch(int total) {
        List<Row> rows = new ArrayList<>(total + 1);

        // add a batch of products
        String product = AVAILABLE_PRODUCTS[random.nextInt(AVAILABLE_PRODUCTS.length)];
        for (int i = 0; i < total; i++) {
            rows.add(new ProductRow(product, random.nextInt(100) + 1));
        }

        // calculate and add a "total row"
        rows.add(calculateTotal(rows));

        return rows;
    }

    private Row calculateTotal(List<Row> rows) {
        return new TotalRow(rows.stream().mapToInt(Row::getAmount).sum());
    }
}

5) 主题风格

@mixin mytheme {
  @include valo;
  // Insert your own theme rules here

  .v-grid-row > td.total-row {
    background-color: #c4e7b7;
    font-weight: bold;
  }
}

6) 结果

 类似资料:
  • 我正在尝试在联接。但是对我来说,缺少一个功能。我为员工创建了,这些网格分为特定的部门,但有员工,这些员工仅在部门中。 不允许在一上添加。 所以结果应该是这样的: 即使< code>Vaadin不直接允许,有什么解决方案可以让我这样做吗? 因为如果我尝试过,它会引发异常

  • 但是,鼠标中键不是由Vaadin注册的。我怎么才能让这个起作用?

  • 我试图创建一个小型应用程序,在该应用程序中,Vaadin网格中存储了各种文件位置,网格目前只显示两列--和,我希望在单击一行时也看到文件位置作为通知。 意思是,每次单击网格中的一行时,我都希望它使用显示位置,如下所示: 由于我的网格选择模型是,默认情况下,单击监听器不能注册它点击了哪一行,并且通过复选框选择行不是我希望显示的数据。简单地说,我希望为我单击的每一行获取项目,并将位置显示为通知。 到目

  • 本文向大家介绍在内部表中添加行并在SAP ABAP中添加标题行,包括了在内部表中添加行并在SAP ABAP中添加标题行的使用技巧和注意事项,需要的朋友参考一下 请注意,不应将标题与内部表一起使用。使用时,in_table2的标头为空。使用循环将其打印如下- 当您具有带有内部表的标头时,不应以相同的方式使用它。您应该使用字段符号进行循环并像这样附加-

  • 我需要制作瓦丁8网格单元格文本换行。我试着在瓦丁论坛上关注这个链接。https://vaadin.com/forum/thread/16908210/vaadin-8-grid-wrap-long-lines 我的网格仅在每个单元格中包含字符串。 我有一个这样的风格生成器类: 我正在从Vaadin 6转换,所以我仍然使用旧主题() 在我的styles.css文件中,有: 在创建网格的类中,我有: