Accessible getAccessible(final Accessible accessibleTable, final int columnIndex) {
	if (accessibles [columnIndex] == null) {
		Accessible accessible = new Accessible(accessibleTable);
		accessible.addAccessibleListener(new AccessibleAdapter() {
			public void getName(AccessibleEvent e) {
				e.result = getText(columnIndex);
				System.out.println("tableItem getName = " + e.result);
			}
		});
		accessible.addAccessibleControlListener(new AccessibleControlAdapter() {
			public void getChild(AccessibleControlEvent e) {
				/* CTable cells do not have children, so just return the index in parent. */
				switch (e.childID) {
					case ACC.CHILDID_CHILD_INDEX:
						e.detail = index * Math.max(1, parent.getColumnCount()) + columnIndex + parent.getColumnCount();
						break;
				}
			}
			public void getChildAtPoint(AccessibleControlEvent e) {
				Point point = parent.toControl(e.x, e.y);
				if (getBounds(columnIndex).contains(point)) {
					e.childID = ACC.CHILDID_SELF;
				} else {
					e.childID = ACC.CHILDID_NONE;
				}
			}
			public void getFocus(AccessibleControlEvent e) {
				e.childID = (parent.focusItem == CTableItem.this && parent.isFocusControl()) ? 
						ACC.CHILDID_SELF : ACC.CHILDID_NONE;
			}
			public void getLocation(AccessibleControlEvent e) {
				Rectangle location = getBounds(columnIndex);
				Point pt = parent.toDisplay(location.x, location.y);
				e.x = pt.x;
				e.y = pt.y;
				e.width = location.width;
				e.height = location.height;
			}
			public void getRole(AccessibleControlEvent e) {
				e.detail = ACC.ROLE_TABLECELL;
			}
			public void getValue(AccessibleControlEvent e) {
				e.result = getText(columnIndex);
			}
		});
		accessible.addAccessibleTableCellListener(new AccessibleTableCellListener() {
			public void getColumnHeaders(AccessibleTableCellEvent e) {
				if (parent.columns.length == 0) {
					/* The CTable is being used as a list, and there are no headers. */
					e.accessibles = null;
				} else {
					/* CTable cells only occupy one column. */
					CTableColumn column = parent.columns [columnIndex];
					e.accessibles = new Accessible[] {column.getAccessible (accessibleTable)};
				}
			}
			public void getColumnIndex(AccessibleTableCellEvent e) {
				e.index = columnIndex;
			}
			public void getColumnSpan(AccessibleTableCellEvent e) {
				/* CTable cells only occupy one column. */
				e.count = 1;
			}
			public void getRowHeaders(AccessibleTableCellEvent e) {
				 /* CTable does not support row headers. */
			}
			public void getRowIndex(AccessibleTableCellEvent e) {
				e.index = index;
			}
			public void getRowSpan(AccessibleTableCellEvent e) {
				/* CTable cells only occupy one row. */
				e.count = 1;
			}
			public void getTable(AccessibleTableCellEvent e) {
				e.accessible = accessibleTable;
			}
			public void isSelected(AccessibleTableCellEvent e) {
				e.isSelected = CTableItem.this.isSelected();
			}
		});
		accessibles [columnIndex] = accessible;
	}
	return accessibles [columnIndex];
}