В настоящее время я работаю над SWT, чтобы создать пользовательский интерфейс для нашего приложения. Я столкнулся с затруднительным положением. Я использую холст для рисования заголовка, который имеет некоторые изображения. Он также должен отображать время (обновляется каждую секунду). Хотя я все это сделал, ловушка заключается в том, что я использую единственный 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);
}
});
}
Затем я использую нить обновления времени каждый второй. Моя трудность состоит в два раза:
- Поскольку я называю header.redraw() и header.update() каждый второй, в сущности, все изображения перерисовывается каждый второй. Могу ли я это избежать?
- Поскольку я использую gridLayout, я не могу вручную поместить currentTime в метку в относительном положении. Есть ли способ сделать это?
У меня нет ответа на ваш вопрос, но, пожалуйста, запомните 'dispose()' все ресурсы, которые вы сами выделяете, например '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. В противном случае у вас могут закончиться ручки. – Baz
Извините, я не совсем понял ваш вопрос. Почему вы создавали приложение для обновления каждую секунду в первую очередь? Обновления пользовательского интерфейса обычно выполняются, когда модель обновляет представление. Кроме того, если вы хотите собрать пользовательское 'Image', вы можете создать' ImageBuilder' (украденный из 'StringBuilder'), который расширяет' CompositeImageDescriptor'. Если вы прочитаете javadoc и пройдете несколько примеров, это будет очень легко понять. – GGrec
@Baz: так было то, что происходило! Спасибо, Баз! :) –