【问题标题】:Can't display GWT DataGrid无法显示 GWT 数据网格
【发布时间】:2026-01-30 20:25:01
【问题描述】:

所以我很高兴用 GWT 创建一个 Datagrid。我已经根据 GWT 的文档创建了我的表,并且我已经添加了我的数据,但我无法得到它或数据网格本身根本无法显示。我错过了什么?我觉得我一直在为此扯头发。我觉得打 aysnc 电话可能是个问题,但我没有收到任何错误。当我编译并执行这部分代码时,屏幕上什么也没有显示,并且数据网格应该在 Dock 上的区域是空的。我是不是忘记了一些琐碎的事情?

        static int orderID = 1001;
        private static List<OrderLine> orderLineList = new ArrayList<OrderLine>();

        final DataGrid<OrderLine> dgOrder = new DataGrid<OrderLine>();
        dgOrder.setWidth("100%");                   

        //set columns
        TextColumn<OrderLine> orderLineIdColumn = new TextColumn<OrderLine>(){
            @Override
            public String getValue(OrderLine object) {
              return Integer.toString(object.getOrderLineID());
            }
        };
        dgOrder.addColumn(orderLineIdColumn, "OrderLine ID");

        TextColumn<OrderLine> productColumn = new TextColumn<OrderLine>(){
            @Override
            public String getValue(OrderLine object) {
              return getProductName(object.getProductNumber());
            }
        };
        dgOrder.addColumn(productColumn, "Product");

        TextColumn<OrderLine> quantityColumn = new TextColumn<OrderLine>(){
            @Override
            public String getValue(OrderLine object) {
              return Integer.toString(object.getQuantity());
            }
        };
        dgOrder.addColumn(quantityColumn, "Quantity");   

        // add data to datagrid
        Ioma.dataservice.getOrderLines(orderID, new AsyncCallback<ArrayList<OrderLine>>(){
            @Override
            public void onFailure(Throwable caught) {// TODO Auto-generated method stub
                System.out.println("error in retrieving GP.getOrderLines" + caught.toString());
            }
            @Override
            public void onSuccess(ArrayList<OrderLine> result) {
                // TODO Auto-generated method stub
               //yes i realize I could also set it to "result" but I use the result in other places as well, I have also tried setting it to result with no success
                orderLineList = result;
                dgOrder.setRowData(0, orderLineList);
            }
        });

        //add datagrid to the dock 
        dock.add(dgOrder, DockPanel.EAST);

        //add dock to mainPanel
        return dock;

【问题讨论】:

    标签: java gwt datagrid


    【解决方案1】:

    当你使用DataGrid 时,你需要给它一个明确的大小。对于CellTable,您不需要这样做,这就是它起作用的原因。

    当您使用DataGrid 时,它就在那里,但高度和宽度均为0。所以你要么需要明确设置大小:

    DataGrid<OrderLine> grid = new DataGrid<OrderLine>;
    grid.setWidth("500px");
    grid.setHeight("600px");
    dock.add(dgOrder, DockPanel.EAST);
    

    或者您可以将网格放在ProvidesResize 小部件中。因此,在您的情况下,我相信您可以使用DockLayoutPanel 而不是您似乎正在使用的DockPanel

    【讨论】:

      【解决方案2】:

      我有一个 smilar problem 。尝试将数据网格放在实现 ProvidesResize 接口的 Panel 中,如 SimpleLayoutPanel。同样在我的情况下,它有助于设置 SimpleLayoutPanel 的大小。

      【讨论】:

        【解决方案3】:

        原来我的问题是我的声明。

         final DataGrid<OrderLine> dgOrder = new DataGrid<OrderLine>();
        

        应该是

        final CellTable<OrderLine> dgOrder = new CellTable<OrderLine>();
        

        我不知道为什么会这样,但确实如此。我现在可以看到我的桌子了。你不应该显式调用我想知道的数据网格实例吗?

        【讨论】:

        • 我认为 CellTables 和 DataGrids 有不同的方法来确定它们应该是什么大小。 DataGrids 更加挑剔,在某些情况下如果没有变通方法就无法工作。例如:*.com/a/15011854/738081
        • 您对上面代码所做的就是调用 celltable。 Datagrid 是一个不同的(更好的)小部件。它没有显示的可能原因是您没有使用正确的包含面板(必须支持调整大小)。