目前我在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! :) –