目前我正在研究SWT,为我们的应用程序创建UI。我遇到了困惑。我正在使用画布绘制标题,其中包含一些图像。它还需要显示时间(每秒刷新一次)。虽然我已经完成了所有这些,但问题是我使用一个paintListener来绘制图像和当前时间。
标题代码的部分如下:
private void initHeader(){
header = new Canvas(shell,SWT.NONE);
GridLayout gd = new GridLayout();
gd.numColumns = 1;
gd.marginHeight = 10;
gd.marginBottom = 10;
gd.verticalSpacing = 0;
header.setLayout(gd);
header.setLayoutData(new GridData(SWT.FILL,SWT.BEGINNING,true,false));
header.layout();
//Paint listener for SDM Logo
header.addPaintListener(new PaintListener() {
private final Image bgLogoImage = new Image(Display.getDefault(),"resources/images/1stimage.png");
private final Image bgLockImage = new Image(Display.getDefault(),"resources/images/2ndimage.png");
private final Image bgHelpImage = new Image(Display.getDefault(),"resources/images/3rdimage.png");
private final int bgImageWidth = bgHelpImage.getBounds().width;
private final int bgImageHeight = bgHelpImage.getBounds().height;
private final int bgLockImageWidth = bgLockImage.getBounds().width;
private final int bgLockImageHeight = bgLockImage.getBounds().height;
@Override
public void paintControl(PaintEvent e) {
e.gc.drawImage(bgLogoImage, 0, 0);
Point lockSize = ((Control) e.widget).getSize();
e.gc.drawImage(bgLockImage, (lockSize.x - bgLockImageWidth) - 50, (lockSize.y
- bgLockImageHeight)/2);
Point size = ((Control) e.widget).getSize();
e.gc.drawImage(bgHelpImage, (size.x - bgImageWidth) - 10, (size.y
- bgImageHeight)/2);
e.gc.setBackground(new Color(display,225,43,41));
e.gc.setForeground(new Color(display,255,255,255));
Date dNow = new Date();
SimpleDateFormat ft = new SimpleDateFormat("MMM d,y E hh:mm:ss a");
e.gc.drawText(ft.format(dNow), header.getClientArea().width - 350, header.getClientArea().y + 10);
}
});
}
然后我用一个线程来每秒更新一次。
我的困难有两个:
答案 0 :(得分:2)
不是只有一个Canvas
,而是Composite
一个带有图像的控件和一个带有时间的控件。然后你可以在该控件的监听器中重新绘制时间。
这些中的任何一个都需要Canvas
吗?您是否可以使用多个Label
控件来保存图像或文字?
如果您希望使用单个控件,则可以使用redraw(x, y, width, height, false)
指定要重绘的控件的区域。在绘图侦听器中,然后调用GC.getClipping
来获取需要重绘的控件部分,并跳过任何不需要执行的绘制操作。