2

我有一个 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();
}

地理地图

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;
            });
        }
    }
});
4

0 回答 0