Ich verwende die neueste stabile Version von SWT.SWT Canvas Location
Ich habe eine Shell mit einer ToolBar, einem ScrolledComposite und einem Canvas. Der Canvas-Bereich wird als Inhalt des ScrolledComposites festgelegt (z. B. scrolledComposite.setContent (Canvas)). Der Canvas wird mit einer bestimmten Größe erstellt, die sich niemals ändert (z. B. 400 x 400). Während der ScrolledComposite ständig wächst oder schrumpft, um den Clientbereich der verfügbaren Shell zu füllen.
Ich habe ein Resize-Listener an die übergeordnete Shell, die Folgendes zu tun versucht: a) vergrößern Sie die ScrolledComposite wie oben beschrieben und b) Center Canvas sowohl horizontal als auch vertikal innerhalb der ScrolledComposite (siehe unten zum Beispiel Code).
Dies funktioniert genau so, wie es unter Mac OS X sein sollte, aber unter Windows wird das Resize-Ereignis ausgelöst und die neuen Positionen werden korrekt berechnet, aber letztendlich springt die Canvas auf 0,0 zurück. Eine weitere kleine Information ist, dass Sie, wenn Sie die Größe des Fensters kontinuierlich ändern, sehen, dass die Arbeitsfläche flackert und es aussieht, als ob sie an der richtigen Stelle kurz gezeichnet wird.
_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);
}
});