One of the main developers of the Echo2 framework, Tod Liebeck, read our article, "A Closer Look at the Echo2 Framework", and emailed us with comments about it. Tod's comments were very informative, here is what he had to say:
I just read your article "A Closer Look at the Echo2 Framework" and noticed the issue you had with layouts. The right component for laying out the prompts and their corresponding data entry fields would have been a Grid. The use of Grids is discouraged for performance reasons as you mentioned, but they do have their place. I advise people to avoid using Grids when other layout components, e.g., Row and Column, are adequate.
The significant performance issue with Grid is that when cells are added to or removed from a Grid, the entire Grid must be re-rendered. This is largely due to the fact that Grids can become fairly intricate with cells that span multiple columns or rows and thus to fractionally update a grid (on the client) as a result of an inserted cell (on the server) could in many cases result in more work than simply re-rendering it entirely. The Column and Row components, on the other hand, can insert and remove cells dynamically without re-rendering the entire component on the client.
Your application (from looking at the screenshots) appears to have the data entry fields laid out using a Row which contains two Columns. As you've seen, there is no guarantee that the height of the cells in Column #1 will be the same as those in Column #2. While you could manually set a minimum size for the cells using ColumnLayoutDatas with their "height" properties set, this practice still would not ensure correct rendering all the time (e.g., if one of the labels wrapped and exceeded the minimum height).
With regard to Tables, they can in fact render any arbitrary component in their cells. To do this, you must define and set a TableCellRenderer that will generate Components based on the model values of each table cell. The default TableCellRenderer implementation assigned to any Table will render Labels containing a string representation (toString()) of each cell's model value.
Best regards
--Tod Liebeck NextApp, Inc.