Программно определить окно максимизации / минимизации ??? Eclipse RCP - PullRequest
0 голосов
/ 27 августа 2011

Как видно из заголовка, я хочу добавить прослушиватель в мой пользовательский интерфейс rcp для обнаружения максимизации и минимизации.На самом деле, это не то, что моя настоящая цель, но я думаю, что это способ решить мою проблему.У меня есть вид с некоторыми фигурами в центре, и я не хочу держать рисунок точно в центре, даже если окно изменено.Для этого я использовал следующий слушатель:

public void createPartControl(final Composite parent) {
    display = parent.getDisplay();
    white= display.getSystemColor(SWT.COLOR_WHITE);
    parent.setLayout(new FillLayout(SWT.VERTICAL));
    final ScrolledComposite sc = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
    sc.setExpandHorizontal(true);
    sc.setExpandVertical(true);
    sc.setMinHeight(100);
    sc.setMinWidth(100);
    sc.setSize(565, 305);
    final Composite child = new Composite(sc,SWT.NONE);   
    child.setLayout(new FillLayout());
    // Set child as the scrolled content of the ScrolledComposite
    sc.setContent(child);
    child.setBackground(white);
    gc = new GC(child);
    parent.addListener (SWT.Resize,  new Listener () {
        public void handleEvent (Event e) {
            x = child.getBounds().width/2;
            y = child.getBounds().height/2;
            child.addPaintListener(new PaintListener() {
                public void paintControl(PaintEvent event) {
                    dessin(gc);  // draw my shapes
    }
    });
}

все идет хорошо, кроме случаев, когда я максимизирую окно, а затем минимизирую его, в этом случае я теряю рисунок (он находится в углу).Любая идея, пожалуйста?Я правильно думаю?

Ответы [ 3 ]

1 голос
/ 28 августа 2011

Два события для обнаружения минимизации и минимизации (не обязательно максимизации): Iconify и Deiconify, которые происходят только в командной консоли.См. Javadocs для Shell .

0 голосов
/ 14 апреля 2017

Чтобы держать что-то в центре чего-то другого, все, что вам нужно, - это событие 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 сможет правильно рассчитать границы оболочки.

0 голосов
/ 28 августа 2011

Подумайте о том, чтобы переместить событие изменения размера для родителя, поскольку размер дочернего элемента не обязательно должен быть изменен.

...