目前我在SWT工作的特定部分,来创建我们的应用程序的UI。我遇到了一个窘境。我正在使用画布绘制标题,其中包含一些图像。它还需要显示时间(每秒刷新一次)。虽然我已经完成了所有这些,但问题在于我使用单个paintListener绘制图像和当前时间。绘制图像SWT
头码的部分如下:
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);
}
});
}
我然后使用一个线程来更新时间的每一秒。 我的困难是双重的:
- 因为我叫header.redraw()和header.update()每秒,实际上,所有的图像都重新绘制每一秒。我能够避免反正
- 由于我使用一个网格布局,我不能手动将currentTime的在标签中的相对位置。有没有办法做到这一点?
我没有回答你的问题,但请记得'处置()'所有的资源,你在'PaintListener'分配自己,像'Image's。否则,你可能会用完手柄。 – Baz
对不起,我不太了解你的问题。你为什么要设计你的应用程序,每秒刷新一次? UI更新通常在模型更新视图时完成。另外,如果你想组装一个自定义的'Image',你可以建立一个'ImageBuilder'(从'StringBuilder'偷来的),它扩展了'CompositeImageDescriptor'。如果你阅读javadoc并通过一些例子,那将很容易弄清楚。 – GGrec
@Baz:这就是发生了什么!谢谢Baz! :) –