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