addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
GC gc = egc;
Point size = getSize();
int beginx = ex;
int beginy = (ey / lineHeight) * lineHeight;
int beginLine = (ey cy) / lineHeight;
int endLine = beginLine + eheight / lineHeight + ;
if (endLine > getItemCount())
endLine = getItemCount();
for (int i = beginLine; i < endLine; i++) {
boolean selected = false;
if (i == rowSel)
selected = true;
onPaint(gc i cx beginy + (i beginLine) * lineHeight
selected);
}
}
});
这里要注意的是从PaintEvent中获取的xyheightwidth是需要重绘的区域xy是以控件的左上角为原点的坐标在我们的程序中为了性能起见我们先根据需要重绘的区域计算出需要重绘的行数只重绘相应的行而不是将整个控件重绘我们程序中用到的onPaint用于绘制一行
接下来我们要让我们的控件响应键盘上下键对列表项进行选择我们已对向上键的处理为例首先当用户按了向上键时我们需要改变选择并且重绘旧的和新的选择项如果选择项已经到了列表的顶部我们还需要同时滚动滚动条
addListener(SWTKeyDown new Listener() {
public void handleEvent(Event event) {
switch (eventkeyCode) {
case SWTARROW_UP: // 处理向上键
if (rowSel != ) {
oldRowSel = rowSel;
rowSel;
if (oldRowSel != rowSel) { //发送消息让控件重绘
((Canvas) eventwidget)redraw(cx (rowSel + cy
/ lineHeight)
* lineHeight maxX lineHeight* false);
}
if (rowSel < cy / lineHeight) { //如果需要滚动滚动条
ScrollBar bar = ((Canvas) eventwidget)
getVerticalBar();
barsetSelection(bargetSelection() lineHeight);
scrollVertical(bar);
}
selectionChanged(); // 发送selectionChanged事件
}
break;
case SWTARROW_DOWN: // down arror key
…
break;
}
}
});
接下来我们要让我们的控件响应鼠标对列表项进行选择首先我们要计算出鼠标选中的行号注意MouseEvent中的y值只是相对于控件左上角的坐标我们需要加上滚动出了控件的部分
[] [] [] [] [] []