Я использую самую последнюю стабильную версию SWT.
У меня есть оболочка, содержащая ToolBar, ScrolledComposite и Canvas. Canvas устанавливается как содержимое ScrolledComposite (например, scrolledComposite.setContent(canvas)). Холст создается с определенным размером, который никогда не меняется (скажем, 400 x 400). Принимая во внимание, что ScrolledComposite постоянно увеличивается или уменьшается, чтобы заполнить клиентскую область доступной родительской оболочки.
У меня есть прослушиватель изменения размера, прикрепленный к родительской оболочке, который пытается сделать следующее: а) увеличить ScrolledComposite, как описано выше, и б) центрировать Canvas как по горизонтали, так и по вертикали внутри ScrolledComposite (см. ниже пример кода).
Это работает точно так же, как и должно быть в Mac OS X, однако в Windows запускается событие изменения размера, и новые местоположения вычисляются правильно, но в конечном итоге Canvas возвращается к 0,0. Еще одна небольшая информация заключается в том, что если вы постоянно изменяете размер окна, вы можете видеть мерцание холста, и это выглядит так, как будто он на короткое время рисуется в правильном месте.
_shell.addListener (SWT.Resize, new Listener () {
public void handleEvent (Event e)
{
int toolBarOffset = _toolBar.getSize().y;
Rectangle clientArea = _shell.getClientArea();
_scrollComposite.setBounds(0, toolBarOffset, clientArea.width, clientArea.height - toolBarOffset);
Point canvasSize = _canvas.getSize();
int canvasX = Math.max(0, (clientArea.width / 2) - (canvasSize.x / 2));
int canvasY = Math.max(0, ((clientArea.height - toolBarOffset) / 2) - (canvasSize.y / 2));
_canvas.setLocation(canvasX, canvasY);
}
});