Vaadin 流程,试图在网格中显示水平布局

Vaadin flow, trying to display Horizontal layout in Grid

我写了下面的代码,我想在 Vaadin Grid 中添加带有 TextBox 和 Button 的 Horizo​​ntalLayout。但是当我 运行 代码显示输出为

com.vaadin.flow.component.orderedlayout.HorizontalLayout@145a03ea com.vaadin.flow.component.orderedlayout.HorizontalLayout@1f7acb46

package com.packagename.myapp;

import java.util.ArrayList;
import java.util.List;

import com.vaadin.flow.component.Text;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.router.Route;

@Route("table")
public class TestTable extends VerticalLayout {
    private Grid<TblValue> grid = new Grid<>();
    public TestTable() {
        init();
    }

    private void init() {
        grid.addColumn(TblValue::getLayout);
        grid.setItems(createData());
        add(grid);
    }

    private List<TblValue> createData(){
        List<TblValue> data = new ArrayList<>();
        data.add(new TblValue());
        data.add(new TblValue());
        return data;
    }

    private class TblValue {
        HorizontalLayout layout = new HorizontalLayout();
        private Text txt = new Text("test string");
        private Button btn = new Button("Submit");
        public TblValue() {
            layout.add(txt, btn);
        }
        public HorizontalLayout getLayout() {
            return layout;
        }
        public void setLayout(HorizontalLayout layout) {
            this.layout = layout;
        }
    }
}

正如 Tatu Lund 在评论中提到的,您的问题的解决方案是使用 grid.addComponentColumn(...) 而不是 grid.addColumn(...)

addColumn(...) 方法将始终显示字符串。如果 valueprovider returns 任何对象,它将显示其字符串值 String.valueOf(object)。这就是你所看到的。 com.vaadin.flow.component.orderedlayout.HorizontalLayout@145a03ea 是您调用 String.valueOf(myHorizontalLayout) 时得到的结果。

另一方面,

addComponentColumn(...) 将采用 valueProvider 返回的 Horizo​​ntalLayout,并将实际组件放入您想要的单元格中。