ArcGisEngineForJava开发
ArcGIS Engine control examples
%arcgishome%sample\Java\Engine\scenario.mapviewer
% arcgishome %/Java/sample/engine/ scenario.mapviewer
这个方案演示所需的步骤来创建一个用于查看预先授过权的ESRI地图文件的应用(mxds)。该方案涵盖以下领域:
- 建立开发环境
- 使用可视化组件构建图形用户界面(GUI)
- 载入地图文件
- 向工具栏添加命令
- 关联ToolbarBean和TOCBean
- 添加工具栏选项到ToolbarBean中
- 使用Toolbar Menu来创建一个弹出式菜单
- 在TOCBean组件中管理、编辑标签
- 在MapBean绘制矩形概述
- 创建自定义工具
- 自定义ToolbarBean
这个方案之后扩展那个简单地图浏览器的功能,通过建立自定义的工具和演示事件处理。为此,探讨了应用程序编程接口(API)的视觉和非视觉的ArcGIS Engine组件。
一个支持可视化GUI设计的Java IDE中,组件可作为拖放JavaBeans组件来使用,在这种情况下,组件将以编程方式被放置来获得更容易理解的代码。
- 一个有能用来开发使用的授权文件的Java平台ArcGIS Engine SDK的安装;
- 一个安装的J2SE JDK开发包,1.5或更高版本的。
- 支持的Java IDE或您最喜爱的文本编辑器。
- 一个初级到中级的编程语言的知识。
为了构建那个应用程序,下面ArcGIS Engine中的Visual JavaBeans将被使用:
com.esri.arcgis.beans.map.mapbean
com.esri.arcgis.beans.pagelayout.pagelayoutbean
com.esri.arcgis.beans.toc.tocbean
com.esri.arcgis.beans.toolbar.toolbarbean
com.esri.arcgis.controls.toolbarmenu
为了参考以前的包,arcobjects.jar必须被添加到您的类路径中。那个arcobjects.jar文件位于%arcgishome%\ArcGIS\Java\lib中。
编译并运行应用程序,使用ArcGIS Engine,设置您的开发环境。了解更多信息,查看安装后。
public class MapViewerFrame extends JFrame{
public void buildAndShow()throws IOException{
} // End MapViewerFrame class.
2创建一个MapViewer.java文件。本文件提供的主要方法,构建MapViewer窗体,给它一个初始的大小,并运行那个窗体。见下面的代码示例:
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import com.esri.arcgis.system.AoInitialize;
import com.esri.arcgis.system.EngineInitializer;
import com.esri.arcgis.system.esriLicenseProductCode;
public static void main(String[] args)throws IOException{
EngineInitializer.initializeVisualBeans();
String laf = UIManager.getSystemLookAndFeelClassName();
UIManager.setLookAndFeel(laf);
final AoInitialize aoInit = new AoInitialize();
aoInit.initialize(esriLicenseProductCode.esriLicenseProductCodeEngine);
MapViewerFrame mapViewerFrame = new MapViewerFrame();
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int height = d.height * 2 / 3;
mapViewerFrame.setBounds(x, y, width, height);
mapViewerFrame.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
mapViewerFrame.buildAndShow();
javac - classpath % ARCGISHOME % \java\lib\arcobjects.jar;. * .java
前面的代码示例编译Java程序并生成应用程序的类文件。如果你得到NoClassDefFoundError,检查你的classpath和验证在指定的位置存在arcobjects.jar。
4。运行MapViewer类,并验证一个空白的Java窗体出现后再进行下一步。为了运行Java程序,单击"运行"按钮在您的IDE或在命令行中输入以下命令:
java - classpath % ARCGISHOME %\java\lib\arcobjects.jar;. MapViewer
5。MapViewerFrame类中添加为这些组件添加成员变量,并在构造函数中创建这些组件。见下面的代码示例:
// Add new imports for this step.
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;
public class MapViewerFrame extends JFrame{
pageLayout = new PageLayoutBean();
statusLabel = new JLabel(" ");
// New method to build the left panel.
private JPanel buildMapTOCPanel(){
JPanel leftPanel = new JPanel();
JPanel bottomPanel = new JPanel();
leftPanel.setLayout(new BorderLayout());
bottomPanel.setLayout(new BorderLayout());
bottomPanel.setPreferredSize(new Dimension(200, 200));
bottomPanel.add(map, BorderLayout.CENTER);
leftPanel.add(toc, BorderLayout.CENTER);
leftPanel.add(bottomPanel, BorderLayout.SOUTH);
7。在MapViewerFrame的BorderLayout的SOUTH位置,添加JLabel作为一个状态栏。那个buildAndShow()方法看起来像下面的代码示例当你更新了所有的布置位置:
public void buildAndShow()throws IOException{
JPanel mapTOCPanel = buildMapTOCPanel();
this.getContentPane().add(toolbar, BorderLayout.NORTH);
this.getContentPane().add(pageLayout, BorderLayout.CENTER);
this.getContentPane().add(mapTOCPanel, BorderLayout.WEST);
this.getContentPane().add(statusLabel, BorderLayout.SOUTH);
8、编译和运行应用程序以确认图形用户界面的布局类似于下面的屏幕截图:
一个标准的Java布局管理器(BorderLayout)已被用来定位组件和管理组件的布局和尺寸。你将能够调整窗口,并适当地检查更新该组件而不需要任何明确的调整代码。
1、当增加组件的时候,为控件加载地图文件,通过添加下面的引入到MapViewer.java文件中:
import com.esri.arcgis.controls.IPageLayoutControlEventsAdapter;
import com.esri.arcgis.controls.IPageLayoutControlEventsOnPageLayoutReplacedEvent;
2、添加下面的代码示例到buildAndShow方法调用之后,在调用this.setVisible()方法之前:
为了跨平台的兼容性,验证用于存储数据的文件和路径名必须是小写文本。
public void buildAndShow()throws IOException{
. . . . . . addEventListeners();
// Load a preauthored map document into the PageLayout bean.
String arcgisHome = System.getenv("ARCGISHOME");
String documentPath = arcgisHome +
"java/samples/data/mxds/gulf of st. lawrence.mxd";
if (pageLayout.checkMxFile(documentPath)){
pageLayout.loadMxFile(documentPath, null);
private void addEventListeners()throws IOException{
pageLayout.addIPageLayoutControlEventsListener(new
IPageLayoutControlEventsAdapter(){
public void onPageLayoutReplaced
(IPageLayoutControlEventsOnPageLayoutReplacedEvent evt)throws
map.loadMxFile(pageLayout.getDocumentFilename(), null, null);
map.setExtent(map.getFullExtent());
为了建立组件间的通信,将下面的代码添加到buildAndShow ()方法中的加载文件的代码之后:
public void buildAndShow()throws IOException{
// Load a preauthored map document on the pageLayout component.
String arcgisHome = System.getenv("ARCGISHOME");
String documentPath = arcgisHome +
"java/samples/data/mxds/gulf of st. lawrence.mxd";
if (pageLayout.checkMxFile(documentPath))
pageLayout.loadMxFile(documentPath, null);
// Set buddy controls to wire up the TOC and toolbar beans
toc.setBuddyControl(pageLayout);
toolbar.setBuddyControl(pageLayout);
工具栏控件已添加到用户界面中。默认情况下,该控件没有填充任何工具。您将在下面的步骤中添加工具。
1、为了添加这些预建的工具栏命令,添加下面的引入到MapViewerFrame.java中:
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.ControlsPagePanTool;
import com.esri.arcgis.controls.ControlsPageZoomInTool;
import com.esri.arcgis.controls.ControlsPageZoomOutTool;
import com.esri.arcgis.controls.ControlsPageZoomPageToLastExtentBackCommand;
import com.esri.arcgis.controls.ControlsPageZoomPageToLastExtentForwardCommand;
import com.esri.arcgis.controls.ControlsPageZoomWholePageCommand;
import com.esri.arcgis.systemUI.esriCommandStyles;
2、在buildAndShow()方法中,在调用addEventListeners()方法之前,给工具栏添加预定义的命令。见下面的代码示例:
// Add generic commands to the toolbar.
toolbar.addItem(new ControlsOpenDocCommand(), 0, - 1, false, 0,
esriCommandStyles.esriCommandStyleIconOnly);
toolbar.addItem(new ControlsPageZoomInTool(), 0, - 1, false, 0,
esriCommandStyles.esriCommandStyleIconOnly);
toolbar.addItem(new ControlsPageZoomOutTool(), 0, - 1, false, 0,
esriCommandStyles.esriCommandStyleIconOnly);
toolbar.addItem(new ControlsPagePanTool(), 0, - 1, false, 0,
esriCommandStyles.esriCommandStyleIconOnly);
toolbar.addItem(new ControlsPageZoomWholePageCommand(), 0, - 1, false, 0,
esriCommandStyles.esriCommandStyleIconOnly);
toolbar.addItem(new ControlsPageZoomPageToLastExtentBackCommand(), 0, - 1, false, 0,
esriCommandStyles.esriCommandStyleIconOnly);
toolbar.addItem(new ControlsPageZoomPageToLastExtentForwardCommand(), 0, - 1, false,
0, esriCommandStyles.esriCommandStyleIconOnly);
toolbar.addItem(new ControlsMapZoomInTool(), 0, - 1, false, 0,
esriCommandStyles.esriCommandStyleIconOnly);
toolbar.addItem(new ControlsMapZoomOutTool(), 0, - 1, false, 0,
esriCommandStyles.esriCommandStyleIconOnly);
toolbar.addItem(new ControlsMapPanTool(), 0, - 1, false, 0,
esriCommandStyles.esriCommandStyleIconOnly);
toolbar.addItem(new ControlsMapFullExtentCommand(), 0, - 1, false, 0,
esriCommandStyles.esriCommandStyleIconOnly);
// Load a preauthored map document on the pageLayout component.
为了展示弹出式菜单,一个onMouseDown的事件处理程序将被添加为PageLayout组件中。右键单击时,该菜单出现。
1、添加下面的引入到mapviewerframe.java文件中:
import com.esri.arcgis.controls.ToolbarMenu;
import com.esri.arcgis.controls.IPageLayoutControlEventsOnMouseDownEvent;
import com.esri.arcgis.controls.ControlsPageZoomInFixedCommand;
import com.esri.arcgis.controls.ControlsPageZoomOutFixedCommand;
2、为ToolbarMenu添加一个成员变量。见下面的代码示例:
public class MapViewerFrame extends JFrame{
3、在一个try/catch语句模块中构造popupMenu对象。见下面的代码示例:
pageLayout = new PageLayoutBean();
statusLabel = new JLabel(" ");
popupMenu = new ToolbarMenu();
4、在buildAndShow()方法里面,在往工具栏中添加命令之前,从com.esri.arcgis.controls包中添加预先建立好的命令到popupMenu组件中。见下面的代码示例:
popupMenu.addItem(new ControlsPageZoomInFixedCommand(), 0, - 1, false,
esriCommandStyles.esriCommandStyleIconAndText);
popupMenu.addItem(new ControlsPageZoomOutFixedCommand(), 0, - 1, false,
esriCommandStyles.esriCommandStyleIconAndText);
popupMenu.addItem(new ControlsPageZoomWholePageCommand(), 0, - 1, false,
esriCommandStyles.esriCommandStyleIconAndText);
popupMenu.addItem(new ControlsPageZoomPageToLastExtentBackCommand(), 0, - 1, false,
esriCommandStyles.esriCommandStyleIconAndText);
popupMenu.addItem(new ControlsPageZoomPageToLastExtentForwardCommand(), 0, - 1,
false, esriCommandStyles.esriCommandStyleIconAndText);
// Add generic commands to the toolbar.
5、在buildAndShow()方法中,使用建立组件之间互相联系的代码来关联popupMenu和PageLayout组件。联想与代码页设置的好友控制在。见下面的代码示例:
// Set buddy controls to wire up the TOC and ToolbarBean
// with the pageLayout object.
toc.setBuddyControl(pageLayout);
toolbar.setBuddyControl(pageLayout);
popupMenu.setHook(pageLayout);
pageLayout.addIPageLayoutControlEventsListener(new IPageLayoutControlEventsAdapter(){
public void onPageLayoutReplaced
(IPageLayoutControlEventsOnPageLayoutReplacedEvent evt)throws IOException{
map.loadMxFile(pageLayout.getDocumentFilename(), null, null); map.setExtent
public void onMouseDown(IPageLayoutControlEventsOnMouseDownEvent evt)throws
// If the right mouse button is clicked, display the popup menu.
popupMenu.popupMenu(evt.getX(), evt.getY(), pageLayout.getHWnd());
7、运行应用程序。右键单击pageLayout组件来显示弹出菜单,并且可在pageLayout内导航。看下面的屏幕截图:
默认情况下,该TOCBean允许用户自动切换图层的可见性,并改变地图和图层名称当他们出现在TOC中时。您将添加代码,以防止用户编辑一个名称,并用一个空字符串替换它。
1、为了类在这一步中可以使用,添加下面的引用到mapviewerframe.java文件中:
import com.esri.arcgis.controls.ITOCControlEventsAdapter;
import com.esri.arcgis.controls.ITOCControlEventsOnEndLabelEditEvent;
import com.esri.arcgis.controls.esriTOCControlEdit;
2、在buildAndShow()方法中,设置labeledit手册。见下面的代码示例
// Set label editing to manual.
toc.setLabelEdit(esriTOCControlEdit.esriTOCControlManual);
private void addEventListeners()throws IOException{
. . . toc.addITOCControlEventsListener(new ITOCControlEventsAdapter(){
public void onEndLabelEdit(ITOCControlEventsOnEndLabelEditEvent labelEditEvt)
String newLabel = labelEditEvt.getNewLabel();
// If the new label is an empty string, prevent the edit.
labelEditEvt.setCanEdit(false);
1、为了类在这一步使用,添加以下引入到mapviewerframe.java文件中:
import com.esri.arcgis.controls.IMapControlEvents2Adapter;
import com.esri.arcgis.controls.IMapControlEvents2OnAfterDrawEvent;
import com.esri.arcgis.controls.IPageLayoutControlEventsOnPageLayoutReplacedEvent;
import com.esri.arcgis.carto.Map;
import com.esri.arcgis.carto.esriViewDrawPhase;
import com.esri.arcgis.display.DisplayTransformation;
import com.esri.arcgis.display.ITransformEventsAdapter;
import com.esri.arcgis.display.ITransformEventsVisibleBoundsUpdatedEvent;
import com.esri.arcgis.display.RgbColor;
import com.esri.arcgis.display.SimpleFillSymbol;
import com.esri.arcgis.display.SimpleLineSymbol;
import com.esri.arcgis.geometry.IEnvelope;
public class MapViewerFrame extends JFrame{
SimpleFillSymbol fillSymbol; // The symbol used to draw the envelope.
IEnvelope currentExtent; // The envelope drawn on the MapBean.
Map focusMap; // The PageLayoutBean's focus map.
3、创建一个createOverviewSymbol ()的私有方法。在pageLayoutBean中,你将在map控件中创建符号用来代表数据的范围。见下面的代码示例:
private void createOverviewSymbol()throws IOException{
RgbColor color = new RgbColor();
color.setTransparency((byte)255);
SimpleLineSymbol outline = new SimpleLineSymbol();
fillSymbol = new SimpleFillSymbol();
color.setTransparency((byte)0);
fillSymbol.setOutline(outline);
4、在从buildAndShow()方法中调用createOverviewSymbol方法之后,设置label编辑手册。见下面的代码示例:
// Set label editing to manual.
toc.setLabelEdit(esriTOCControlEdit.esriTOCControlManual);
// Create symbol used to draw overview on the MapBean.
pageLayout.addIPageLayoutControlEventsListener(new IPageLayoutControlEventsAdapter(){
public void onPageLayoutReplaced
(IPageLayoutControlEventsOnPageLayoutReplacedEvent evt)throws IOException{
map.loadMxFile(pageLayout.getDocumentFilename(), null, null); map.setExtent
(map.getFullExtent()); focusMap = new Map(pageLayout.getActiveView()
.getFocusMap()); currentExtent = focusMap.getExtent();
pageLayout.addIPageLayoutControlEventsListener(new IPageLayoutControlEventsAdapter(){
public void onPageLayoutReplaced
(IPageLayoutControlEventsOnPageLayoutReplacedEvent evt)throws IOException{
map.loadMxFile(pageLayout.getDocumentFilename(), null, null); map.setExtent
(map.getFullExtent()); focusMap = new Map(pageLayout.getActiveView()
.getFocusMap()); currentExtent = focusMap.getExtent();
DisplayTransformation dt = new DisplayTransformation
(focusMap.getScreenDisplay().getDisplayTransformation());
dt.addITransformEventsListener(new ITransformEventsAdapter(){
public void visibleBoundsUpdated
(ITransformEventsVisibleBoundsUpdatedEvent evt)throws IOException{
// Set currentExtent to the new visible extent.
currentExtent = evt.getSender().getVisibleBounds();
// Refresh the map components foreground phase.
map.refresh(esriViewDrawPhase.esriViewForeground, null, null);
public void onMouseDown(IPageLayoutControlEventsOnMouseDownEvent evt)throws
map.addIMapControlEvents2Listener(new IMapControlEvents2Adapter(){
public void onAfterDraw(IMapControlEvents2OnAfterDrawEvent evt)throws
if (evt.getViewDrawPhase() == esriViewDrawPhase.esriViewForeground){
// Draw the shape on the MapBean.
map.drawShape(currentExtent, fillSymbol);
System.err.println("Error in drawing shape on MapBean");
8、运行应用程序。在pageLayout中,使用前面添加的地图导航工具来改变焦点地图的范围,并且观察在map组件上面,作为一个红的矩形,被画出的新的范围。看到下面的屏幕截图:
1、创建一个AddDateTool.java文件。在默认的构造函数中,设置一些BaseTool的受保护的(protected)变量的值。见下面的代码示例:
import com.esri.arcgis.controls.BaseTool;
public class AddDateTool extends BaseTool{
//Set various protected properties specified by BaseTool.
name = "CustomCommands_Add Date";
message = "Adds a date element to the page layout";
import com.esri.arcgis.controls.HookHelper;
public class AddDateTool extends BaseTool{
public void onCreate(Object obj){
hookHelper = new HookHelper();
"Exception caught inside AddDateTool.onCreate(). Throwing as new RuntimeException.");
throw new RuntimeException(ex);
4、添加类和将由onMouseDown方法使用的接口的导入语句。见下面的代码示例:
import java.text.SimpleDateFormat;
import com.esri.arcgis.carto.IActiveView;
import com.esri.arcgis.carto.TextElement;
import com.esri.arcgis.carto.esriViewDrawPhase;
import com.esri.arcgis.display.TextSymbol;
import com.esri.arcgis.geometry.IPoint;
import com.esri.arcgis.support.ms.stdole.StdFont;
5、重写onMouseDown方法,它创建了一个使用当前日期作为文本的TextElement,并将其添加到挂钩对象的图形容器中。该AddDateTool类是完整的,且是可编译的。见下面的代码示例:
public void onMouseDown(int button, int shift, int x, int y){
// Format the date in the form of "Wed 25 Aug, 2004".
formatter = new SimpleDateFormat("EEE d MMM, yyyy");
String dateString = formatter.format(today);
TextSymbol textSymbol = new TextSymbol();
// Create a text element to add to the graphics container.
TextElement textElement = new TextElement();
textElement.setSymbol(textSymbol);
textElement.setScaleText(false);
textElement.setText(dateString);
// Add the text element to the graphics container.
IActiveView activeView = hookHelper.getActiveView();
IPoint pt = activeView.getScreenDisplay().getDisplayTransformation()
activeView.getGraphicsContainer().addElement(textElement, 0);
activeView.partialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
"Exception caught inside AddDateTool.onCreate(). Throwing as new RuntimeException.");
throw new RuntimeException(ex);
6、在MapViewerFrame中,添加AddDateTool的实例到toolbar组件的buildAndShow ()方法中的添加预定义命令到工具栏的代码行之后。见下面的代码示例:
toolbar.addItem(new ControlsMapFullExtentCommand(), 0, - 1, false, 0,
esriCommandStyles.esriCommandStyleIconOnly);
toolbar.addItem(new AddDateTool(), 0, - 1, true, 0,
esriCommandStyles.esriCommandStyleTextOnly);
7、重新编译并启动MapViewer类。工具栏上出现了一个新的添加日期工具(Add Date tool)。单击该工具,然后单击"页面布局"以增加今天的日期(在那个位置)。看到下面的屏幕截图:
1、添加下面的引用到MapViewerFrame.java文件中。见下面的代码示例:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import com.esri.arcgis.controls.CustomizeDialog;
import com.esri.arcgis.controls.ICustomizeDialogEvents;
import com.esri.arcgis.controls.ICustomizeDialogEventsOnCloseDialogEvent;
import com.esri.arcgis.controls.ICustomizeDialogEventsOnStartDialogEvent;
. . . public class MapViewerFrame extends JFrame{
JCheckBox customizeCB; // JCheckbox to control toolbar customization.
CustomizeDialog customizeDialog;
// The Customize dialog box used by the ToolbarBean constructor.
3、创建一个createCustomizeDialog ()方法,是为了实例化那个自定义对话框。见下面的代码示例:
private void createCustomizeDialog()throws IOException{
customizeDialog = new CustomizeDialog();
customizeDialog.setDialogTitle("Customize Toolbar Items");
customizeDialog.setShowAddFromFile(true);
// Set the toolbar in which to add new items.
customizeDialog.setDoubleClickDestination(toolbar);
4、在buildandShow ()方法中,调用createCustomizeDialog ()方法来实例化自定义对话框。也实例化JcheckBox的实例名为customizeCB。见下面的代码示例:
public void buildAndShow()throws IOException{
JPanel mapTOCPanel = buildMapTOCPanel();
customizeCB = new JCheckBox("Customize");
5、在addEventListeners方法中,添加一个实例化JcheckBox的实例名为customizeCB的监听器来打开和关闭"自定义"对话框。见下面的代码示例:
private void addEventListeners()throws IOException{
... customizeCB.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if (customizeCB.isSelected()){
customizeDialog.startDialog(toolbar.getHWnd());
customizeDialog.closeDialog();
JPanel topPanel = new JPanel();
topPanel.setLayout(new BorderLayout());
topPanel.add(toolbar, BorderLayout.CENTER);
topPanel.add(customizeCB, BorderLayout.EAST);
this.getContentPane().add(topPanel, BorderLayout.NORTH);
this.getContentPane().add(toolbar, BorderLayout.NORTH);
this.getContentPane().add(pageLayout, BorderLayout.CENTER);
this.getContentPane().add(mapTOCPanel, BorderLayout.WEST);
private void addEventListeners()throws IOException{
... customizeDialog.addICustomizeDialogEventsListener(new ICustomizeDialogEvents
public void onStartDialog(ICustomizeDialogEventsOnStartDialogEvent arg0)
public void onCloseDialog(ICustomizeDialogEventsOnCloseDialogEvent arg0)
toolbar.setCustomize(false); java.awt.EventQueue.invokeLater(new
customizeCB.setSelected(false);
8、运行该应用程序,并选择"自定义"复选框,以便将工具栏放入自定义模式,并打开"自定义"对话框。
10、关闭"自定义toolbar(工具栏)"项目对话框,以停止自定义应用程序。单击"选择工具"来移动包含今天日期的文本元素。看到下面的屏幕截图:
为了成功地将此应用程序部署在用户的机器上,需要创建一个可执行的JAR文件。用户可以使用一个Java运行环境(JRE)启动这个应用程序。
1、定位到编译Java类文件的目录中,创建一个manifest.txt文件。
4、保存文件并打开命令窗口。在命令提示符下,使用cd命令打开包含manifest.txt文件目录。
- 为获得更多的ArcGIS开发信息,包括论坛,更新示例,和技术主题, Java资源中心。