Чтобы держать что-то в центре чего-то другого, все, что вам нужно, - это событие SWT.Resize
, поэтому этот вопрос является классическим случаем XY Задачи .(За исключением того, что OP в этом случае, кажется, уже подозревает, что это может быть проблемой XY.)
Однако многие люди приходят к этому вопросу с законной необходимостью программно определять минимизированные / развернутые / восстановленные события окна,по следующей причине:
Если вы хотите иметь возможность сохранять границы окна вашего приложения при выходе, вы не можете просто сохранить все, что возвращается Shell.getBounds (), потому что ваше приложение может быть прервано при минимизацииили развернутый или полноэкранный, в этом случае его границы не должны сохраняться.То, что следует сохранить, это минимизированное / нормальное / развернутое / полноэкранное состояние оболочки (я называю это «позой») и границы оболочки в прошлый раз, когда ее положение было «нормальным».Таким образом, по сути, вам необходимо отслеживать, когда положение «нормальное», и для этого вам нужно иметь событие «изменение положения».
Проблема в том, что когда SWT выдает событие «deiconified», он еще не вычислил границы оболочки, поэтому значение, которое вы получите в этом случае, является фиктивным.
Итак, вот решение этого вопроса:
Вам понадобитсяметод, который пересчитывает положение следующим образом:
private void recalculatePosture()
{
Posture posture = swtShell.getFullScreen()? Posture.FULLSCREEN
: swtShell.getMinimized()? Posture.MINIMIZED
: swtShell.getMaximized()? Posture.MAXIMIZED
: Posture.NORMAL;
if( posture != previousPosture )
{
issue event...
previousPosture = posture;
}
}
Для генерации «развернутых», «восстановленных (из развернутых)» и «полноэкранных» событий вы можете использовать Shell.addListener()
для прослушивания *События 1018 * и SWT.Resize
и вызов recalculatePosture()
при их возникновении.
Для генерации «минимизированного» события вы можете использовать метод shellIconified()
ShellListener
как @ the.duckmanсказал, и снова, вызовите recalculatePosture()
.
. Чтобы сгенерировать событие «восстановлено (из минимизированного)», вам нужно сделать следующее в вашем ShellListener
:
@Override
protected void onShellDeiconified( ShellEvent e )
{
display.asyncExec( () -> recalculatePosture() );
}
Это приведет к перерасчету осанки через короткое время после событие 'deiconified', когда SWT сможет правильно рассчитать границы оболочки.