private void refreshSensorIcons() {
        
        Set<Long> exsitingSensorIds = new HashSet<>();
        
        for (sosafe.model.SensorInfo sensorInfo : list) {
            // Record all existing sensor ids for deleting missing sensors
            exsitingSensorIds.add(sensorInfo.getSensorId());
            // Donot add duplicated sensor icons
            if (sensorIcons.containsKey(sensorInfo.getSensorId())) {
                continue;
            }
            
            // Add new Sensor Icons
            SensorIcon newSensor = FlyweightSensorIconFactory.getSensorIcon(sensorInfo);
            subMapPanel.add(newSensor);
            sensorIcons.put(newSensor.getSensorId(), newSensor);
            Insets insets = subMapPanel.getInsets();
            int ScreenPosX = insets.left + newSensor.getIcon().getIconWidth();
            int ScreenPosY = insets.top;
            int width = newSensor.getIcon().getIconWidth();
            int height = newSensor.getIcon().getIconHeight();
            
            try {
                String[] coordinates = sensorInfo.getScreenPosition().split(",");
                if (coordinates.length > 0) ScreenPosX = Integer.parseInt(coordinates[0].trim());
                if (coordinates.length > 1) ScreenPosY = Integer.parseInt(coordinates[1].trim());
            } finally {
                newSensor.setBounds(ScreenPosX, ScreenPosY, width, height);
            }
        }
        
        Map<Long, SensorIcon> newSensorIcons = new HashMap<>();
        for (Long sensorId: sensorIcons.keySet()) {
            // Delete missing Sensor Icons
            if (!exsitingSensorIds.contains(sensorId)) {
                subMapPanel.remove(sensorIcons.get(sensorId));
            } else {
                newSensorIcons.put(sensorId, sensorIcons.get(sensorId));
            }
        }
        sensorIcons = newSensorIcons;
    }