gpt4 book ai didi

java - 绘制图像的特定部分 SWT

转载 作者:行者123 更新时间:2023-11-30 09:14:05 25 4
gpt4 key购买 nike

目前我正在研究 SWT,为我们的应用程序创建 UI。我陷入了困境。我正在使用 Canvas 绘制标题,其中包含一些图像。它还需要显示时间(每秒刷新一次)。虽然我已经完成了所有这些,但要注意的是我正在使用单个 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 放置在标签中的相对位置。有什么办法吗?

最佳答案

与其拥有一个 Canvas,不如在一个 Composite 中拥有两个控件,一个是图像,一个是时间。然后您可以在该控件的监听器中重绘时间。

这些都需要是 Canvas 吗?不能使用多个可以容纳图像或文本的 Label 控件吗?

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

关于java - 绘制图像的特定部分 SWT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20673585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com