Java 绘制图像SWT的特定部分

Java 绘制图像SWT的特定部分,java,layout,user-interface,swt,Java,Layout,User Interface,Swt,目前我正在研究SWT,为我们的应用程序创建UI。我陷入了困境。我正在使用画布绘制标题,其中包含一些图像。它还需要显示时间(每秒刷新一次)。虽然我已经完成了所有这些,但问题是我正在使用一个paintListener来绘制图像和当前时间 标题代码的部分如下所示: private void initHeader(){ header = new Canvas(shell,SWT.NONE); GridLayout gd = new GridLayout()

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

  • 由于我每秒调用header.redraw()和header.update(),实际上,所有图像都是每秒重画的。我能避免吗
  • 由于我使用gridLayout,所以无法手动将标签中的currentTime放置在相对位置。有办法吗

  • 您可以在一个
    组合中有两个控件,一个带有图像,一个带有时间,而不是一个
    画布。然后您可以在该控件的侦听器中重新绘制时间

    是否需要将其中任何一个设置为
    画布
    ?您是否可以使用多个
    标签
    控件来保存图像或文本


    如果要保留单个控件,可以使用
    重画(x,y,width,height,false)
    指定要重画的控件区域。然后在paint listener中调用
    GC.getClipping
    以获取控件中需要重新绘制的部分,并跳过任何不需要进行的绘制操作。

    我对您的问题没有答案,但请记住
    dispose()
    您自己分配的所有资源,像
    画质监听器中的
    图像
    s。否则你可能会没办法了。对不起,我不太明白你的问题。首先,你为什么要设计你的应用程序,让它每秒钟刷新一次?UI更新通常在模型更新视图时完成。此外,如果您想组装自定义的
    图像
    ,您可以构建一个
    图像生成器
    (从
    StringBuilder
    )来扩展
    合成图像描述符
    。如果你阅读javadoc并仔细阅读一些例子,你就会很容易理解它。@Baz:原来就是这样!谢谢你,巴兹!:)@Binayakacharaborty我做了什么?讽刺?@Baz:不,我一直收到一些奇怪的SWT错误,“失控”。我真的很感激……嗯,我不知道重画函数的重载,我会检查一下:)