import org.eclipse.swt.*; import org.eclipse.swt.graphics.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; /** * @author Thomas Singer */ public class VirtualOwnerDrawnTable { public static void main(String[] args) { final Display display = new Display(); final Shell shell = new Shell(display); shell.setLayout(new FillLayout(SWT.VERTICAL)); final Table table = new Table(shell, SWT.VIRTUAL | SWT.BORDER | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI); table.setHeaderVisible(false); final Listener listener = event -> { final TableItem item = (TableItem)event.item; if (event.type == SWT.EraseItem) { event.detail &= ~SWT.FOREGROUND; } else if (event.type == SWT.PaintItem) { event.gc.drawText((String)item.getData(), event.x, event.y, true); } else if (event.type == SWT.MeasureItem) { final String text = (String)item.getData(); final Point point = event.gc.textExtent(text); event.height = point.y; event.width = Math.max(event.width, point.x); } else if (event.type == SWT.SetData) { final int index = table.indexOf(item); final String data = "Item " + index; item.setData(data); } }; table.addListener(SWT.EraseItem, listener); table.addListener(SWT.SetData, listener); table.addListener(SWT.MeasureItem, listener); table.addListener(SWT.PaintItem, listener); final TableColumn column = new TableColumn(table, SWT.LEFT); column.setText("Column"); column.setResizable(false); table.addListener(SWT.Paint, event -> { setColumnWidth(column); }); table.setVisible(false); table.setItemCount(100); shell.setSize(200, 300); setColumnWidth(column); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } private static void setColumnWidth(TableColumn column) { final Table table = column.getParent(); final Rectangle area = table.getClientArea(); System.out.println("area = " + area); column.setWidth(area.width); } }