sListener(new??FocusListener()??{
???? public??void??focusGained(FocusEvent??e)??{
???? ((Canvas)??e.getSource()).redraw(cx,??rowSel??*??lineHeight,??maxX,
?????? lineHeight,??true);
???? }
???? public??void??focusLost(FocusEvent??e)??{
???? ((Canvas)??e.getSource()).redraw(cx,??rowSel??*??lineHeight,??maxX,
?????? lineHeight,??true);
???? }
?? });
?ò???ú??????ò???áD±í??ê±?éò??óè??D??μ±?°???tê?·?μ?μ??1μ?£?è?1????tμ?μ?á??1μ?£??ò???í?ú???Dμ?????é??-ò???Dé?ò?£????ê??ò??????ò???áD±í??μ?′ú??£?×¢òa?ú′ú??μ?×?oó?????1μ?μ?Dé?ò?£
void??onPaint(GC??gc,??int??row,??int??beginx,??int??beginy,??boolean??isSelected)??{
?? Color??initColor??=??gc.getBackground();
?? Color??initForeColor??=??gc.getForeground();
?? if??(isSelected)??{
???? gc.setBackground(Display.getCurrent().getSystemColor(
?????? SWT.COLOR_LIST_SELECTION));
???? gc.fillRectangle(beginx,??beginy,??maxX,??lineHeight);
???? gc.setForeground(Display.getCurrent().getSystemColor(
?????? SWT.COLOR_LIST_SELECTION_TEXT));
?? }??else??{
???? gc.setBackground(initColor);
?? }
?? gc.drawString((String)??colorNames.get(row),??beginx??+??24,??beginy);
?? Color??color??=??Display.getCurrent().getSystemColor(
???? ((Integer)??colors.get(row)).intValue());
?? gc.setBackground(color);
?? gc.fillRectangle(beginx??+??2,??beginy??+??2,??20,??lineHeight??-??4);
?? gc.setBackground(initColor);
?? gc.setForeground(initForeColor);
?? if??(isFocusControl()??&&??isSelected)
???? gc.drawFocus(cx,??beginy,??maxX,??lineHeight);
?? }
开发Eclipse自定义控件(4)
时间:2011-02-09 IBM 梁骞
作为一个可操作的控件,TAB键的支持也是很重要的。由于我们的控件是从Canvas继承过来的,不支持TAB键。下面的代码使我们的控件有TAB键的支持:
addTraverseListener(new TraverseListener() {
public void keyTraversed(TraverseEvent e) {
if (e.detail == SWT.TRAVERSE_TAB_NEXT
|| e.detail == SWT.TRAVERSE_TAB_PREVIOUS) {
e.doit = true;
}
};
});
很多时候,我们需要有滚动条的支持。对于滚动条,我们只要在上面加上selectionListener,处理它的widgetSelected事件就可以。
bar = getVerticalBar();
if (bar != null) {
bar.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
scrollVertical((ScrollBar) event.widget);
}
});
}
下面是函数scrollVertical的代码。一旦用户对滚动条操作,我们就可以计算出要滚动的区域,然后调用scroll函数。对函数scroll函数的调用会导致相应区域的重绘。
void scrollVertical(ScrollBar scrollBar) {
Rectangle bounds = getClientArea();
int y = -scrollBar.getSelection();
if (y + maxY < bounds.height) {
y = bounds.height - maxY;
}
if( y%lineHeight !=0 )
y = y - y % lineHeight - lineHeight;
scroll(cx, y, cx, cy, maxX, maxY, false);
cy = y;
}
现在我们的程序已经基本成形了,我们来进一步完善它。由于我们开发的控件是提供给程序员的,我们需要提供接口,让外部知道控件中发生的事件。其中最 |