코드 샘플: 지도상에서 객체 업데이트 및 다시 렌더링하기

다음 코드 샘플은 동적으로 표시 가능한 객체를 만들고, 이 객체를 지도에 추가하고, 객체의 위치를 동적으로 업데이트하는 방법을 보여줍니다. 이 코드 샘플에서 프로그램은 사용자가 화면에서 버튼을 누를 때마다 동적으로 표시 가능한 객체에 대해 새 좌표를 생성합니다. 일반적으로 이 데이터는 사용자의 현재 위치를 요청하거나 웹 서비스로부터 위치 정보를 받는 방식으로 얻을 수 있습니다.

/*
 * DynamicMappableApp.java
 */
import net.rim.device.api.lbs.maps.*;
import net.rim.device.api.lbs.maps.model.*;
import net.rim.device.api.lbs.maps.ui.*;
import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.container.*;
import net.rim.device.api.system.*;
import java.util.Random;
public class DynamicMappableApp extends UiApplication 
{
    public static final void main( String[] args ) 
    {
        new DynamicMappableApp().enterEventDispatcher();
    }
    public DynamicMappableApp() 
    {
        pushScreen( new DynamicMappableScreen() );
    }
    private class DynamicMappableScreen extends FullScreen implements 
            FieldChangeListener
    {
        private RichMapField map;
        private MapDataModel model;
        private UpdatableMappable mappableObject;
        private ButtonField button;
        private DynamicMappableScreen() 
        {
            super(FullScreen.DEFAULT_CLOSE | FullScreen.DEFAULT_MENU);
            // Create the map.
            map = MapFactory.getInstance().generateRichMapField();
            map.getAction().enableOperationMode(MapConstants.MODE_SHARED_FOCUS); 
            map.getMapField().setDimensions(new MapDimensions(Display.getWidth(), 
                    Display.getHeight()-100));
            map.getMapField().getAction().setCenter(new MapPoint( 45.0, -75.0));
            map.getMapField().getAction().setZoom(4);
            add(map);
            // Create an instance of the dynamic mappable class and add it to
            // the data model for the map.
            mappableObject = new UpdatableMappable(45.0, -75.0, "Map Location", 
                    "Dynamic Updates");     
            model = map.getModel();
            model.add(mappableObject, "dynamic", true);
            // Create and add a button that initiates an update.
            button = new ButtonField("Update Location");
            button.setChangeListener(this);
            add(button);            
        }
        public void fieldChanged (Field field, int context)
        {
            // Create a random value between 0 and 0.03 in steps of 0.0001
            // to update the lat and lon with.
            Random randomizer = new Random();
            double dlat = randomizer.nextInt(300) / 10000.0;
            double dlon = randomizer.nextInt(300) / 10000.0;           
            mappableObject.setLat(44.985 + dlat);
            mappableObject.setLon(-74.985 + dlon);
            // Create and trigger a MappableChangeEvent that captures the old 
            // and new values.
            MappableChangeEvent event = new MappableChangeEvent();
            event.setOldState((Mappable) new MapPoint(mappableObject.oldLat, 
                    mappableObject.oldLon));
            event.setNewState(mappableObject);
            mappableObject.getEventManager().triggerEvent(event);
        }
    }      
}
/*
 * UpdatableMappable.java
 */
import net.rim.device.api.lbs.maps.model.*;
public class UpdatableMappable extends MapLocation implements DynamicMappable 
{   
    public MappableEventManager eventManager;
    // Stores the old latitude and longitude.
    public double oldLat;
    public double oldLon;
    public UpdatableMappable(double lat, double lon, String name, String description) 
    {
        super(lat, lon, name, description);
        eventManager = new MappableEventManager();
    }
    public void setLon(final double lon) 
    {
        // Record the old value before it's changed.
        oldLon = getLon();
        super.setLon(lon);
    }
    public void setLat(final double lat) 
    {
        // Record the old value before it's changed.
        oldLat = getLat();
        super.setLat(lat);
    }
    public MappableEventManager getEventManager() 
    {
        return eventManager;
    }
}

이 정보가 도움이 되었습니까? 의견을 보내 주십시오.