У меня есть вид 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;
});
}
}
});