2013-12-19 195 views
2

目前我在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); 
     } 
    });  
} 

我然後使用一個線程來更新時間的每一秒。 我的困難是雙重的:

  1. 因爲我叫header.redraw()和header.update()每秒,實際上,所有的圖像都重新繪製每一秒。我能夠避免反正
  2. 由於我使用一個網格佈局,我不能手動將currentTime的在標籤中的相對位置。有沒有辦法做到這一點?
+2

我沒有回答你的問題,但請記得'處置()'所有的資源,你在'PaintListener'分配自己,像'Image's。否則,你可能會用完手柄。 – Baz

+1

對不起,我不太瞭解你的問題。你爲什麼要設計你的應用程序,每秒刷新一次? UI更新通常在模型更新視圖時完成。另外,如果你想組裝一個自定義的'Image',你可以建立一個'ImageBuilder'(從'StringBuilder'偷來的),它擴展了'CompositeImageDescriptor'。如果你閱讀javadoc並通過一些例子,那將很容易弄清楚。 – GGrec

+0

@Baz:這就是發生了什麼!謝謝Baz! :) –

回答

2

而不是有一個Canvas你可以在一個Composite一個與圖像和一個與時間兩個控件。然後,您可以只在該控件的偵聽器中重新繪製時間。

做這些需要一個Canvas?你不能使用多個可以容納圖像或文字的控件嗎?

如果你想留在一個單一的控制,您可以使用redraw(x, y, width, height, false)指定要重繪控制的區域。在繪畫監聽器中,您可以調用GC.getClipping來獲取需要重繪的控件部分,並跳過不需要完成的任何繪製操作。

+0

嗯,我不知道超載的重繪功能,將調查這件事情:) –