我的Primefaces版本为3.0.M3有问题。 我使用了gmap和prime p:ajax。我想做点什么就是当Gmap上的用户点击标记时点击Marker。
这是代码
<p:tabView effect="slide" effectDuration="normal" style="width:1050px;height:450px" >
<p:tab title="blabla">
<h:panelGrid colums="1">
</h:panelGrid>
</p:tab>
<p:tab title="blabla" >
<h:panelGrid colums="1">
<h:form id="mapId">
<p:gmap id="asd" center="39.000409,35.201554"
zoom="#{mapBean.modelMap.zoomLevel}"
type="ROADMAP"
style="width:1000px;height:400px"
model="#{mapBean.emptyModel}"
widgetVar="map" >
<p:ajax event="overlaySelect" listener="#{mapBean.onMarkerSelect}"/>
</p:gmap>
</h:form>
</h:panelGrid>
</p:tab></p:tabView>
和My ManagedBean
public void onMarkerSelect(OverlaySelectEvent event) {
Marker marker = (Marker) event.getOverlay();
if (marker!=null) {
System.out.println(marker.getId());
}
System.out.println("Clicked");
modelMap.setZoomLevel(modelMap.getZoomLevel()+1);
}
托管Bean声明
@ManagedBean(name="mapBean")
@RequestScoped
public class MapBean implements Serializable
我正在NullPointerException
方法中使用onMarkerSelect
。(event.getOverlay();
)
答案 0 :(得分:6)
解决了我的问题。
问题在于,当创建MapModel
时,它是一个本地var:
public MapModel getModel() {
final MapModel mapModel = new DefaultMapModel(); // this should be a field
final Set<MapEventDto> events = service.loadEvents();
for (MapEventDto event : events) {
final double latitude = event.getLatitude().doubleValue();
final double longitude = event.getLongitude().doubleValue();
final String magnitude = event.getMagnitude().toString();
final String title = "Id: " + event.getId() + ", Lat: " + latitude + ", Lng: " + longitude + ", Mag: " + magnitude;
mapModel.addOverlay(new Marker(new LatLng(latitude, longitude), title));
}
return mapModel;
}
渲染地图后可以对整个mapModel
进行垃圾回收(因为不再需要)。因此,当调用叠加事件时,将不再有mapModel
。
一旦mapModel
Bean
字段{{1}},问题就消失了。
答案 1 :(得分:3)
使用static
字段,如下所示。
它对我有用。
final static MapModel mapModel = new DefaultMapModel();
答案 2 :(得分:0)
final DefaultMapModel mapModel = new DefaultMapModel();
在viewScoped中用作全局变量 最好 VJ
答案 3 :(得分:0)
通过这个并通过将Bean的范围更改为ViewScoped
而不是请求范围来解决,因此它在用户活动期间持续。
不需要最终/静态声明器
@ManagedBean(name="mapBean")
@ViewScoped
public class MapBean implements Serializable {
private MapModel draggableModel;
...
}
答案 4 :(得分:0)
只需将您的bean范围更改为@SessionScoped
或@ViewScoped
,这样就不会为每个请求初始化您的bean。