FlexTable with components
package com.java2s.gwt.client; import com.google.gwt.user.client.*; import com.google.gwt.user.client.ui.*; import com.google.gwt.core.client.*; public class GWTClient implements EntryPoint{ private final Object[][] rowData = { { new DeleteButton("Delete"), "A", "B", "C", "D"}, { new DeleteButton("Delete"), "E", "F", "G", "H"}, { new DeleteButton("Delete"), "I", "J", "K", "L"}, }; private final ComponentFlexTable table = new ComponentFlexTable(rowData); private void onCellClicked(SourcesTableEvents sender, final int row, final int cell){ if (row == 0) { return; } final Widget widget = table.getWidget(row, cell); if (widget instanceof Label == false) { return; } final Label label = (Label)widget; final TextBox textBox = new TextBox(); textBox.setText(table.getText(row, cell)); table.setWidget(row, cell, textBox); DeferredCommand.addCommand(new Command() { public void execute() { textBox.setFocus(true); textBox.selectAll(); } }); textBox.addKeyboardListener( new KeyboardListenerAdapter() { public void onKeyPress(Widget sender, char keyCode, int modifiers) { if (keyCode == KeyboardListener.KEY_ENTER) { label.setText(textBox.getText()); table.setWidget(row, cell, label); } else if (keyCode == KeyboardListener.KEY_ESCAPE) { table.setWidget(row, cell, label); } } }); textBox.addFocusListener(new FocusListenerAdapter() { public void onLostFocus(Widget sender) { label.setText(textBox.getText()); table.setWidget(row, cell, label); } }); } public void onModuleLoad() { table.addColumn(""); table.addColumn("Column 1"); table.addColumn("Column 2"); table.addColumn("Column 3"); table.addColumn("Column 4"); RootPanel.get().add(table); table.addTableListener(new TableListener() { public void onCellClicked(SourcesTableEvents sender, final int row, final int cell) { GWTClient.this.onCellClicked(sender, row, cell); } }); } private class DeleteButton extends Button { public DeleteButton(String text) { super(text); addClickListener(new ClickListener() { public void onClick(Widget sender) { table.removeRow(getThisRow()); table.updateRowStyle(); } }); } private int getThisRow() { for (int i=1; i < table.getRowCount(); ++i) { if (table.getWidget(i, 0) == this) { return i; } } return -1; } } } class ComponentFlexTable extends FlexTable { protected static final int HEADER_ROW = 0; private int rowIndex = 1; private Object[][] rowData = null; public ComponentFlexTable(Object[][] rowData) { insertRow(HEADER_ROW); getRowFormatter().addStyleName(HEADER_ROW,"ComponentFlexTable-Header"); setCellSpacing(0); addStyleName("ComponentFlexTable"); this.rowData = rowData; createRows(0); updateRowStyle(); } public void createRows(int rowIndex) { if (rowData == null) return; for (int row = rowIndex; row < rowData.length; row++) { addRow(rowData[row]); } } private void addRow(Object[] cellObjects) { for (int i = 0; i < cellObjects.length; i++) { addCell(rowIndex, i, cellObjects[i]); } rowIndex++; } public void addCell(int row, int cell, Object cellObject) { if (cellObject instanceof Widget) setWidget(row, cell, (Widget) cellObject); else setWidget(row, cell,new Label(cellObject.toString())); getCellFormatter().addStyleName(row, cell,"ComponentFlexTable-Cell"); } public void updateRowStyle() { HTMLTable.RowFormatter rf = getRowFormatter(); for (int row = 1; row < getRowCount(); ++row) { if ((row % 2) != 0) { rf.removeStyleName(row,"ComponentFlexTable-EvenRow"); rf.addStyleName(row,"ComponentFlexTable-OddRow"); }else { rf.removeStyleName(row,"ComponentFlexTable-OddRow"); rf.addStyleName(row,"ComponentFlexTable-EvenRow"); } } } public void addColumn(Object columnHeading) { Widget widget = new Label(columnHeading.toString()); int columnIndex = getColumnCount(); widget.setWidth("100%"); widget.addStyleName("ComponentFlexTable-ColumnLabel"); setWidget(HEADER_ROW, columnIndex, widget); getCellFormatter().addStyleName(HEADER_ROW, columnIndex,"ComponentFlexTable-ColumnLabelCell"); } public int getColumnCount() { return getCellCount(HEADER_ROW); } } ///////////// .ComponentFlexTable { border-top: thin solid #444444; border-left: thin solid #444444; border-right: thin solid #111111; border-bottom: thin solid #111111; background-color: #505050; } .ComponentFlexTable-Header { } .ComponentFlexTable-OddRow { background-color: #cccccc; } .ComponentFlexTable-EvenRow { background-color: #505050; } .ComponentFlexTable-ColumnLabel { color: white; padding: 3px; } .ComponentFlexTable-ColumnLabelCell { color: white; border-width: 0 0 0 1px; border-style: solid; border-color: white; margin: 0; padding: 0; text-align: center; } .ComponentFlexTable-Cell { border-width: 0px 0px 0px 1px; border-style: solid; color: white; border-color: white; padding: 5px; }