一个简单的ArcGis Engine浏览器的实现。
如果需要更加强大的代码,可以看看學習奮鬥的代码
http://www.blogjava.net/ahanflw/archive/2008/06/15/207985.html
简单的效果图:

代码:

MapViewer显示界面
package eli.arcgis;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;

import javax.swing.JFrame;
import javax.swing.JPopupMenu;
import javax.swing.JSplitPane;
import javax.swing.JToolBar;
import javax.swing.UIManager;
import javax.swing.plaf.basic.BasicBorders;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.esri.arcgis.beans.TOC.TOCBean;
import com.esri.arcgis.beans.map.MapBean;
import com.esri.arcgis.beans.pagelayout.PageLayoutBean;
import com.esri.arcgis.beans.toolbar.ToolbarBean;
import com.esri.arcgis.carto.IActiveView;
import com.esri.arcgis.carto.IElement;
import com.esri.arcgis.carto.Map;
import com.esri.arcgis.carto.esriViewDrawPhase;
import com.esri.arcgis.controls.ControlsMapFullExtentCommand;
import com.esri.arcgis.controls.ControlsMapPanTool;
import com.esri.arcgis.controls.ControlsMapZoomInTool;
import com.esri.arcgis.controls.ControlsMapZoomOutTool;
import com.esri.arcgis.controls.ControlsOpenDocCommand;
import com.esri.arcgis.controls.IMapControlEvents2Adapter;
import com.esri.arcgis.controls.IMapControlEvents2OnAfterDrawEvent;
import com.esri.arcgis.controls.IPageLayoutControlEventsAdapter;
import com.esri.arcgis.controls.IPageLayoutControlEventsOnPageLayoutReplacedEvent;
import com.esri.arcgis.controls.MapControl;
import com.esri.arcgis.controls.ToolbarControl;
import com.esri.arcgis.display.DisplayTransformation;
import com.esri.arcgis.display.IColor;
import com.esri.arcgis.display.ITransformEventsAdapter;
import com.esri.arcgis.display.ITransformEventsVisibleBoundsUpdatedEvent;
import com.esri.arcgis.display.SimpleFillSymbol;
import com.esri.arcgis.display.SimpleLineSymbol;
import com.esri.arcgis.geometry.IEnvelope;
import com.esri.arcgis.interop.AutomationException;
import com.esri.arcgis.system.AoInitialize;
import com.esri.arcgis.system.EngineInitializer;
import com.esri.arcgis.system.esriLicenseProductCode;
import com.esri.arcgis.system.esriLicenseStatus;

import eli.arcgis.util.EngineUtil;


/** *//**
* MapViewer地图浏览器。
*
* @author <a href="mailto:eli.wuhan@gmail.com">屹砾(ELi)</a>
*
*/

public class MapViewer extends JFrame
{
private static final long serialVersionUID = -6897363819055879676L;
private static final Log log = LogFactory.getLog(MapViewer.class);
private static final Dimension screenSize = Toolkit.getDefaultToolkit()
.getScreenSize();
// 主窗体的容器
private Container container = null;

private ToolbarBean toolbar = null;
private PageLayoutBean pageLayout = null;
private TOCBean toc = null;
private MapBean map = null;

private JToolBar statebar = null;

private SimpleFillSymbol fillSymbol = null;
private IEnvelope currExtent = null;
private Map focusMap = null;


static
{

try
{
// 设置与系统界面一致的显示界面
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
// 设置默认组件级别,避免重量级组件覆盖轻量级组件
JPopupMenu.setDefaultLightWeightPopupEnabled(false);

} catch (Exception e)
{
e.printStackTrace();
}
}


public MapViewer()
{
super("MapViewer");
container = getContentPane();

toolbar = new ToolbarBean();
pageLayout = new PageLayoutBean();
toc = new TOCBean();
map = new MapBean();

statebar = new JToolBar();

setSize(screenSize);

this.addWindowListener(new WindowAdapter()
{
@Override

public void windowClosing(WindowEvent e)
{

try
{
new AoInitialize().shutdown();

} catch (IOException e1)
{
log.debug("IOException", e1);
}
}
});
// setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}


public void buildAndShow() throws IOException
{
container.add(toolbar, BorderLayout.NORTH);
container.add(statebar, BorderLayout.SOUTH);
JSplitPane coreComponent = buildCoreComponent(pageLayout, toc, map);
container.add(coreComponent, BorderLayout.CENTER);

toolbar.setBuddyControl(pageLayout);
toc.setBuddyControl(pageLayout);

fillSymbol = createSimpleFillSymbol();
pageLayout.setAutoMouseWheel(false);
pageLayout.setAutoKeyboardScrolling(false);
// 加载PageLayoutControl事件监听
pageLayout

.addIPageLayoutControlEventsListener(new IPageLayoutControlEventsAdapter()
{
private static final long serialVersionUID = -4618783472021055494L;

// 当PageLayoutControl更新时的事件监听
@Override
public void onPageLayoutReplaced(
IPageLayoutControlEventsOnPageLayoutReplacedEvent arg0)

throws IOException, AutomationException
{
// 同时更新MapLayout
map.loadMxFile(pageLayout.getDocumentFilename(), null,
null);
map.setExtent(map.getFullExtent());

// 更新鹰眼图的区域范围
focusMap = (Map) pageLayout.getActiveView()
.getFocusMap();
currExtent = focusMap.getExtent();
DisplayTransformation idt = (DisplayTransformation) focusMap
.getScreenDisplay().getDisplayTransformation();
// 添加显示更改事件监听,在PageLayoutControl发生更新的进行监听处理
idt

.addITransformEventsListener(new ITransformEventsAdapter()
{

private static final long serialVersionUID = -2061574161286942891L;

// 当可视范围更新时将鹰眼范围同时更新(刷新MapControl前景的鹰眼)
@Override
public void visibleBoundsUpdated(
ITransformEventsVisibleBoundsUpdatedEvent arg0)
throws IOException,

AutomationException
{
currExtent = arg0.getSender()
.getVisibleBounds();
map
.refresh(
esriViewDrawPhase.esriViewForeground,
null, null);
}
});
map

.addIMapControlEvents2Listener(new IMapControlEvents2Adapter()
{
private static final long serialVersionUID = 4150539305812983569L;

// 在MapControl地图绘制完毕之后,绘制鹰眼图
@Override
public void onAfterDraw(
IMapControlEvents2OnAfterDrawEvent arg0)
throws IOException,

AutomationException
{

if (arg0.getViewDrawPhase() == esriViewDrawPhase.esriViewForeground)
{
map.drawShape(currExtent,
fillSymbol);
}
}
});
}

});
setVisible(true);

addToolbarItemsOnToolbar(toolbar.getToolbarControl());

String mx = "D:/ArcGIS/java/samples/data/mxds/gulf of st. lawrence.mxd";

if (pageLayout.checkMxFile(mx))
{
pageLayout.loadMxFile(mx, null);
}
IActiveView activeView = pageLayout.getActiveView();
IEnvelope envelope = EngineUtil.createIEnvelope(1d, 1.2d, 2d, 2.2d);
IElement northArrow = EngineUtil.createNorthArrow(envelope, activeView);
activeView.getGraphicsContainer().addElement(northArrow, 0);
activeView.partialRefresh(esriViewDrawPhase.esriViewGraphics,
northArrow, envelope);
IEnvelope envelope2 = EngineUtil.createIEnvelope(1d, 1d, 9.8d, 1.2d);
IElement scalebar = EngineUtil.createScaleLineScaleBar(envelope2,
activeView);
activeView.getGraphicsContainer().addElement(scalebar, 0);
activeView.partialRefresh(esriViewDrawPhase.esriViewGraphics, scalebar,
envelope2);
}


/** *//**
* 生成鹰眼框
*
* @return 鹰眼框
* @throws IOException
*/

private SimpleFillSymbol createSimpleFillSymbol() throws IOException
{
IColor color = EngineUtil.getRGBColor(255, 0, 0);
color.setTransparency((byte) 255);

SimpleLineSymbol line = new SimpleLineSymbol();
line.setColor(color);
line.setWidth(20 * getOnePixelsInchOnMap(map.getMapControl()));

SimpleFillSymbol fill = new SimpleFillSymbol();
color.setTransparency((byte) 0);
fill.setColor(color);
fill.setOutline(line);
return fill;
}


/** *//**
* 获取显示设备上一个点在地图上的宽度。
*
* @param mc
* 地图框
* @return 显示设备上一个点在地图上的宽度。
* @throws IOException
*/

protected double getOnePixelsInchOnMap(MapControl mc) throws IOException
{
double realWidth = 0d;
double onePixelsInch = 0d;
int width = 0;

try
{
realWidth = mc.getActiveView().getScreenDisplay()
.getDisplayTransformation().getVisibleBounds().getWidth();

} catch (IOException e)
{
log.debug("IOException", e);
throw e;
}
width = mc.getWidth();
onePixelsInch = realWidth / width;
return onePixelsInch;
}


/** *//**
* 构建主要部件
*
* @param pageLayoutBean
* 页面框
* @param tocBean
* 目录框
* @param mapBean
* 地图框
* @return 可拉伸面板
*/
private JSplitPane buildCoreComponent(PageLayoutBean pageLayoutBean,

TOCBean tocBean, MapBean mapBean)
{
JSplitPane mainPane = new JSplitPane();
JSplitPane leftPane = new JSplitPane();
mainPane.setLeftComponent(leftPane);
mainPane.setRightComponent(pageLayoutBean);
int size = screenSize.width / 5;
mainPane.setDividerLocation(size);
mainPane.setBorder(BasicBorders.getSplitPaneBorder());

leftPane.setSize(leftPane.getPreferredSize());
leftPane.setLeftComponent(tocBean);
leftPane.setRightComponent(mapBean);
leftPane.setOrientation(JSplitPane.VERTICAL_SPLIT);
leftPane.setResizeWeight(1d);
size = screenSize.height - size;
leftPane.setDividerLocation(size);
leftPane.setBorder(BasicBorders.getSplitPaneBorder());

return mainPane;
}


/** *//**
* 构建工具栏
*
* @param toolbarCtrl
* 工具栏
* @throws AutomationException
* @throws IOException
*/
private void addToolbarItemsOnToolbar(ToolbarControl toolbarCtrl)

throws AutomationException, IOException
{

Object[] o =
{ new ControlsOpenDocCommand(),// 打开地图文档
new ControlsMapZoomInTool(),// 放大
new ControlsMapZoomOutTool(),// 缩小
new ControlsMapPanTool(),// 漫游
new ControlsMapFullExtentCommand() // 全图
};

for (int i = 0; i < o.length; i++)
{
toolbarCtrl.addItem(o[i], 0, -1, false, 0, 1);
}
}


![]()