GeoMap не центрируется правильно - PullRequest
2 голосов
/ 07 февраля 2020

У меня есть вид RCP с виджетом GeoMap внутри. Когда вид создан, карта центрируется на позиции.

У меня проблема в том, что когда GeoMap вызывает getSize(), это неправильно. Возвращается (0,0).

Я нашел один способ исправить это, но он потребовал изменения кода в GeoMap, хотя я считаю, что проблема заключается в коде в представлении. Если я изменю метод setCenterPosition на GeoMap, чтобы использовать клиентскую область родителей, это сработает.

Вид

@PostConstruct
public void createPartControl(final Composite parent) {
    Display.getDefault().asyncExec(() -> setInitialPosition());
}

private void setInitialPosition() {
    widget.setCenterPosition(new PointD(longitude, latitude));
    widget.redraw();
}

GeoMap

public void setCenterPosition(final Point p) {

    // `parent.getClientArea()` instead of `getSize()`
    final Rectangle size = getParent().getClientArea();

    setMapPosition(p.x - (size.width / 2), p.y - (size.height / 2));
}

Проблема в том, что мне пришлось изменить код в GeoMap, чтобы исправить проблему, которая может быть связана с получением размера представления. Размер представления не был установлен к тому времени, когда я звонил, чтобы центрировать карту.

Я также попытался добавить слушателя изменения размера в представление. Это не всегда дает одинаковые результаты при получении размера виджета GeoMap.

parent.addListener(SWT.Resize, new Listener() {
    @Override
    public void handleEvent(final org.eclipse.swt.widgets.Event e) {
        if (firstResize) {
            setInitialPosition();
            firstResize = false;
        }
    }
});

Здесь упоминает, что должен использоваться слушатель изменения размера, и getClientArea. Проблема в том, что GeoMap не использует getClientArea, но я не знаю, должно ли это быть.

Это проблема с тем, как я звоню setCenterPosition, или ошибка в GeoMap?

Обновление

Я также пытался добавить слушатель изменения размера к виджету.

widget.addListener(SWT.Resize, new Listener() {
    @Override
    public void handleEvent(final org.eclipse.swt.widgets.Event e) {
        if (firstResize) {
            setInitialPosition();
            firstResize = false;
        }
    }
});

По какой-то причине размер, который получает виджет, равен слишком маленький. Он получает размер (615, 279), когда он должен быть (768, 388). Добавив кнопку для вызова setCenterPosition снова, он получит правильный размер (768, 388).

. Я могу это исправить, если добавить его в блок async, но это скорее обходной путь, чем реальный фикс.

widget.addListener(SWT.Resize, new Listener() {
    @Override
    public void handleEvent(final org.eclipse.swt.widgets.Event e) {
        if (firstResize) {
            Display.getDefault().asyncExec(() -> {
                setInitialPosition();
                firstResize = false;
            });
        }
    }
});
...