2013-12-19 144 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

嗯,我不知道超载的重绘功能,将调查这件事情:) –