绘制图像SWT的特定部分

时间:2013-12-19 04:38:54

标签: java layout user-interface swt

目前我正在研究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);
        }
    });     
}
然后我用一个线程来每秒更新一次。 我的困难有两个:

  1. 因为我每秒都调用header.redraw()和header.update(),实际上,所有图像都会每秒重绘一次。无论如何我可以避免吗
  2. 由于我使用了gridLayout,因此我无法手动将currentTime放在标签中的相对位置。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:2)

不是只有一个Canvas,而是Composite一个带有图像的控件和一个带有时间的控件。然后你可以在该控件的监听器中重新绘制时间。

这些中的任何一个都需要Canvas吗?您是否可以使用多个Label控件来保存图像或文字?

如果您希望使用单个控件,则可以使用redraw(x, y, width, height, false)指定要重绘的控件的区域。在绘图侦听器中,然后调用GC.getClipping来获取需要重绘的控件部分,并跳过任何不需要执行的绘制操作。