Una aplicación de pruebas
Hasta ahora hemos ido viendo piezas sueltas que configuraban los distintos
componentes que íbamos a necesitar para realizar nuestro pequeño visor. Vamos a ver
ahora cómo podemos juntar todas esas piezas y alguna más para crear un sencillo visor
que nos permita probarlo todo sin necesidad de arrancar todo gvSIG.
Para ello, nos centraremos en el proyecto **org.gvsig.visor.main**. En él podemos
encontrar una clase *main* con todo lo que necesitamos para presentar nuestro
mapa y probar nuestros componentes.
Nuestro programa presentará una ventana con un mapa y unos cuantos botones para
hacer zoom, o activar las herramientas de pan o nuestra herramienta de información
sobre las parcelas de una manzana.
.. Tip::
Puede ser de utilidad consultar la documentación existente
sobre el componente MapControl_ Esta documentación no
ha sido actualizada con los cambios que se han
realizado en dicho componente en la versión 2 de gvSIG,
pero a grandes lineas sigue aportando la misma funcionalidad
y ayudara a entender mejor la herramienta.
.. _MapControl : https://gvsig.org/web/reference_catalog/lookupObject?uuid=416853bc5bfba13f4c14bd1c71049170
Para ello tendremos que:
- Crear nuestro componente swing para presentar un mapa::
mapControlManager = MapControlLocator.getMapControlManager();
mapControl = mapControlManager.createJMapControlPanel();
- Le añadiremos las herramientas estándar de zoom y pan y fijaremos
la herramienta de pan como la herramienta activa:
.. code-block:: java
mapControl.addBehavior(
"zoom",
new Behavior[] {
new RectangleBehavior(new ZoomInListenerImpl(mapControl)),
new PointBehavior(new ZoomOutRightButtonListener(mapControl))
}
);
mapControl.addBehavior(
"pan",
new MoveBehavior(
new PanListenerImpl(mapControl)
)
);
mapControl.setTool("pan");
- Añadiremos los botones y los enlazaremos a las herramientas que acabamos de
registrar en nuestro mapa:
.. code-block:: java
toolBar.add(
new JButton(
new AbstractAction("Zoom") {
public void actionPerformed(ActionEvent e) {
mapControl.setTool("zoom");
}
}
)
);
- Crearemos nuestra capa de manzanas y la añadiremos al mapa:
.. code-block:: java
FLyrVect layer = (FLyrVect) MapContextLocator.getMapContextManager().createLayer(
"Blocks",
manager.getBlocks()
);
mapControl.getMapContext().getLayers().addLayer(layer);
- Y por último crearemos nuestra propia herramienta de información y la registraremos
en el mapa:
.. code-block:: java
PropertiesOfBlockListener listener = new PropertiesOfBlockListener();
mapControl.addBehavior(SHOWINFO_TOOL_NAME, new PointBehavior(listener));
Para ello registraremos un comportamiento de tipo punto, al que asociaremos un *listener*
particular para que realice las acciones que no interesen. El código del *listener*
sería:
.. code-block:: java
public class PropertiesOfBlockListener extends AbstractPointListener {
public void point(PointEvent event) throws BehaviorException {
VisorSwingManager swingManager = VisorSwingLocator.getSwingManager();
VisorBlock block;
try {
block = swingManager.getManager().getBlock(event.getMapPoint());
if( block == null ) {
return;
}
JPanel panel = swingManager.createJVisorBlockPanel(block);
ToolsLocator.getWindowManager().showWindow(panel, "Block information", WindowManager.MODE.TOOL);
} catch (VisorException e) {
// FIXME: Process exception
throw new RuntimeException("Can't show properties of selected block.",e);
}
}
}
Básicamente derivaremos de *AbstractPointListener* sobre-escribiendo el método *point* que
es llamado para realizar la acción asociada a esta herramienta. Este método se limitará a llamar
a nuestro método *getBlocks* a partir de la posición del mapa sobre la que se hizo clic, y si
se obtiene alguna manzana en ese punto se creará nuestro panel para presentar esa información
en una ventana.
Lo mas destacable tal vez sería que cuando consultemos en el parámetro *event* por las
coordenadas del punto sobre el que se ha hecho clic se haga a través del método *getMapPoint*
para asegurarnos que nos lo devuelve en coordenadas del mapa y no de pantalla.