2

我想知道如何在Apache Click中使用 Table 控件。我真正需要知道的是如何填充表格控件。到目前为止,我看到的示例涉及使用示例中未定义的方法。在下面的示例中,方法 getCustomerService() 和 getCustomersSortedByName(10) 没有定义,这使得该示例难以理解。有人知道填充表格控件的简单方法吗?一个完整的例子会很棒。

public class SimpleTablePage extends Page {
    @Bindable protected Table table = new Table();

    // Constructor ------------------------------------------------------------
    public SimpleTablePage() { 
        table.setClass(Table.CLASS_ITS);
        table.addColumn(new Column("id"));
        table.addColumn(new Column("name"));            
        table.addColumn(new Column("email"));
        table.addColumn(new Column("investments"));
    }

    // Event Handlers ---------------------------------------------------------
    /** * @see Page#onRender() */
    @Override
    public void onRender() { 
        List list = getCustomerService().getCustomersSortedByName(10); 
        table.setRowList(list);
    }
}
4

1 回答 1

0

我意识到这个问题已经存在几个月了,但它没有任何答案,我觉得它值得一个。

我也对这个例子感到失望。没有迹象表明该列表应该是什么。我不记得我是如何找到这个答案的。也许是盯着表格的代码太久了。数据的实际呈现位于 Column 类的 render 方法中。

应该在 setRowList 函数中传递给 Table 的 List 应该是 List<Map<String,Object>>。每个 Map 代表一行,其中 Map 以表的列名为键。该行单元格的内容将是 Maps 值的 toString() 方法的结果。

private List<Map<String,Object>> getCustomersSortedByName( final int count )
{
    final List<Map<String,Object>> toReturn = new LinkedList<Map<String,Object>>();
    //I call all my return variables "toReturn" so I know what's going to come out.

    final Customer customers[count];

    //populate your customer array and sort it here

    for( final Customer customer : customers )
    {
        final Map<String,Object> customerMap = new HashMap<String,Object>();
        customer.put( "id", customer.getId() );
        customer.put( "name", customer.getName() );
        customer.put( "email", customer.getEmail() );
        customer.put( "investments", customer.getInvestments() );

        toReturn.add( customerMap );
    }

    return toReturn;
}

这不是剪切和粘贴代码,可能会产生错误。它仍然是 Table.setRowList(List) 的演示。

还有 Table.setDataProvider(DataProvider) 方法,但在我看来,这似乎是一种更长的方法来做 setRowList 已经做的事情。DataProvider 也需要一个返回 Map<String,Object> 的迭代器。我还没有发现使用这种方法的优势,但我已经在示例代码中使用了它。

public TestPage extends Page
{
    private Table table = new Table( "table" );

    @Override
    public void onInit()
    {
        table.addColumn( new Column( "property", "property" ) );
        table.addColumn( new Column( "value", "value" ) );
        table.setDataProvider( new DataProvider(){
                                                  public List getData(){
                                                          return someList();
                                                  }
                                                  } );
        addControl( table );
    }

    private List<Map<String,String>> someList()
    {
        final List<Map<String,String>> toReturn = new LinkedList<Map<String,String>>();
        final Enumeration e = System.getProperties().propertyNames();
        while( e.hasMoreElements() )
        {
            final String prop = (String) e.nextElement();
            final Map<String,String> property = new TreeMap<String,String>();
            property.put( "property", prop );
            property.put( "value", System.getProperty( prop, "N/A" ) );
            toReturn.add( property );
        }
        return toReturn;
    }
}

这只是昨天编写的概念验证代码,所以我没有费心清理它。我不确定这里有什么优势,因为无论您使用哪种方法,渲染所有这些所需的时间都是相同的。使用这种方法,数据处理发生在渲染而不是初始化时。似乎这是一种惰性初始化模式,因为在渲染之前没有对数据进行任何处理。

于 2013-06-06T16:46:20.347 回答