目录
前言
SuperMap iObjects Java是一款强大的地理信息系统(GIS)开发工具包,可以用于构建各种GIS应用程序。本文将介绍如何在IntelliJ IDEA中创建SuperMap的UI界面,并进行相关的开发。需要参考CSDN博客提前部署好环境。SuperMap iObjects Java组件开发——环境部署(IntelliJ IDEA)_nannan^_^的博客-CSDN博客SuperMap iObjects Java 是面向GIS应用系统开发者的组件式GIS开发平台,具有强大的地理数据管理、编辑、显示、分析等功能,并且其具有极强的易用性和丰富的帮助资源,适宜快速开发大型GIS应用系统。本文将介绍如何在IntelliJ IDEA集成开发环境中进行SuperMap iObjects Java组件的环境部署。https://blog.csdn.net/nan620403/article/details/133810990
一、实现思路
1.1 创建顶级容器
创建一个继承自JFrame
的类,作为顶级容器。
// 创建 JFrame 窗口
JFrame frame = new JFrame("SuperMap UI 窗口");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//表示在关闭窗口时直接退出程序
frame.setSize(1400, 800);
frame.setExtendedState(Frame.MAXIMIZED_BOTH);//使 JFrame 窗口在显示时占据整个屏幕的空间,最大化窗口的宽度和高度,以便最大程度地利用可用的显示区域。
1.2 设置布局管理器
设置顶级容器的布局管理器,以控制窗口的位置和大小。创建JSplitPane窗口,将窗口分割成三个区域,左侧分割窗口的顶部加载工作空间管理器,底部加载图层管理器,右侧风格窗口添加存储场景和地图的JTabbedPane选项卡。
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());//是将 JPanel 的布局管理器设置为 BorderLayout,以便使用 BorderLayout 的布局规则来摆放该面板上的组件。
//创建分割窗格
JSplitPane jSplitPane = new JSplitPane();//用于创建可拖动的分割窗格,可以将两个组件放置在水平或垂直方向上的分割线两侧。
jSplitPane.setDividerSize(10);//将设置分割窗格的分割线大小为 10 像素。
jSplitPane.setDividerLocation(260);// 将设置分割窗格的分割线位置为距离容器起始位置 260 像素的位置。
JSplitPane leftsplitPane = new JSplitPane();//创建左侧分割窗口
leftsplitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);//表示垂直分割,即将容器分割为上下两部分。
leftsplitPane.setDividerLocation(250);// 将设置分割窗格的分割线位置为距离容器起始位置 250 像素的位置。
/*
在左侧分割窗口的顶部窗口添加带有标签和线框的panel1,panel1里添加工作空间管理器控件
*/
JPanel panel1 = new JPanel();
panel1.setLayout(new BorderLayout());//是将 JPanel 的布局管理器设置为 BorderLayout,以便使用 BorderLayout 的布局规则来摆放该面板上的组件。
panel1.setBorder(new TitledBorder("工作空间管理器"));
panel1.add(workspaceTree);
leftsplitPane.setTopComponent(panel1);//在左侧分割窗口设置顶部组件
JTabbedPane jTabbedPane = new JTabbedPane();
// 将选项卡添加到 JTabbedPane
jTabbedPane.addTab("地图窗口", mapControl);
jTabbedPane.addTab("场景窗口", sceneControl);
jSplitPane.add(jTabbedPane, JSplitPane.RIGHT);//将选项卡容器加到右侧分割面板
/*
在左侧分割窗口的底部窗口添加带有标签和线框的panel2,panel2里添加图层管理器控件
*/
JPanel panel2 = new JPanel();
panel2.setLayout(new BorderLayout());//是将 JPanel 的布局管理器设置为 BorderLayout,以便使用 BorderLayout 的布局规则来摆放该面板上的组件。
panel2.setBorder(new TitledBorder("图层管理器"));
panel2.add(layersTree);
leftsplitPane.setBottomComponent(panel2);//在左侧分割窗口设置底部组件
jSplitPane.add(leftsplitPane, JSplitPane.LEFT);//将leftsplitPane分割窗口添加到左侧分割面板
1.3 添加监听事件
1.3.1 监听JFrame
窗口
监听JFrame
窗口事件,SceneControl必须在监听窗口事件中打开frame.addWindowListener(new java.awt.event.WindowAdapter(){});
frame.addWindowListener(new java.awt.event.WindowAdapter() {//监听窗口事件,sceneControl必须有这个监听窗口事件
public void windowClosing(java.awt.event.WindowEvent e) {
sceneControl.dispose();
}
public void windowOpened(java.awt.event.WindowEvent e) {
openScene();//打开场景
scenetolayer();//场景窗口与图层管理器联动
}
});
1.3.2 监听JTabbedPane选项卡
监听JTabbedPane选项卡,使地图和场景与图层管理器相关联。若当前窗口为地图窗口,则移除layer3DsTree,添加layersTree,使地图和二维图层树相关联。若当前窗口为场景窗口,则移除layersTree,添加layer3DsTree,使场景和三维图层树相关联。
jTabbedPane.addChangeListener(new ChangeListener() {//监听选项卡更改事件
public void stateChanged(ChangeEvent e) {
// 获取当前选中的选项卡索引
int selectedIndex = jTabbedPane.getSelectedIndex();
// 在选项卡被选择时执行你的操作
if(selectedIndex==0){
panel2.remove(layer3DsTree);
panel2.add(layersTree);
panel2.revalidate();//布局的重新计算
panel2.repaint();//布局的重绘
}else{
panel2.remove(layersTree);
panel2.add(layer3DsTree);
panel2.revalidate();
panel2.repaint();
}
}
});
1.4 显示GUI界面
将顶级容器设置为可见状态,显示GUI界面。
panel.add(jSplitPane, BorderLayout.CENTER);
frame.setContentPane(panel);//用于设置 JFrame 窗口的内容面板(content pane)的方法
// 显示窗口
frame.setVisible(true);
1.5 加载数据并显示
1.5.1 打开工作空间
打开工作空间主要用到 Workspace.open(workspaceConnectionInfo)接口,下面的WorkspaceTree是打开工作空间将工作空间赋予工作空间树,可以看到工作空间里有哪些数据。
WorkspaceConnectionInfo workspaceConnectionInfo = new WorkspaceConnectionInfo();
workspaceConnectionInfo.setType(WorkspaceType.SMWU);
workspaceConnectionInfo.setServer("D:/supermap/11.1.1/正式版/supermap-iobjectsjava-11.1.1-win-all/SampleData/World/World.smwu");
workspace = new Workspace();
workspace.open(workspaceConnectionInfo);
workspaceTree = new WorkspaceTree();
workspaceTree.setWorkspace(workspace);
1.5.2 打开地图
打开地图主要是Map.open("地图名称")接口,而MapControl.getMap()可以拿到当前地图窗口中的Map。
mapControl = new MapControl();
mapControl.getMap().setWorkspace(workspace);
mapControl.getMap().open("世界地图");
mapControl.getMap().refresh();
1.5.3 地图与图层相关联
将地图窗口的Map赋给图层管理器的layersTree图层树,使地图与图层管理器相关联。
layersTree = new LayersTree();
layersTree.setMap(mapControl.getMap());
1.5.4 打开场景
打开场景主要是Scene.open("场景名称")接口,而SceneControl.getScene()可以拿到当前场景窗口中的Scene。
sceneControl = new SceneControl();
sceneControl.getScene().setWorkspace(workspace);
sceneControl.getScene().open("场景");
sceneControl.getScene().refresh();
1.5.5 场景与图层相关联
将场景窗口的Scene赋给图层管理器的layer3DsTree图层树,使场景与图层管理器相关联。
layer3DsTree = new Layer3DsTree();
layer3DsTree.setScene(sceneControl.getScene());
二、完整代码
import javax.swing.*;
import javax.swing.border.TitledBorder;
import java.awt.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import com.supermap.data.*;
import com.supermap.mapping.*;
import com.supermap.realspace.*;
import com.supermap.ui.*;
public class ce1 {
private static Workspace workspace = null;
private static WorkspaceTree workspaceTree;
private static MapControl mapControl;
private static SceneControl sceneControl;
private static LayersTree layersTree = null;
private static Layer3DsTree layer3DsTree = null;
private static Map map = null;
private static Scene scene = null;
public static void main(String[] args) {
sceneControl = new SceneControl();
openWorkspace();//打开工作空间
openMap();//打开地图
maptolayer();//地图窗口与图层管理器窗口联动
//SwingUtilities.invokeLater作用是将任务放入事件调度线程(EDT)中执行,以确保界面操作的线程安全性。
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
/**
* 创建窗口,将窗口分割成三个区域,分别加载工作空间管理器、图层管理器、场景和地图的tab
*/
private static void createAndShowGUI() {
// 创建 JFrame 窗口
JFrame frame = new JFrame("SuperMap UI 窗口");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//表示在关闭窗口时直接退出程序
frame.setSize(1400, 800);
frame.setExtendedState(Frame.MAXIMIZED_BOTH);//使 JFrame 窗口在显示时占据整个屏幕的空间,最大化窗口的宽度和高度,以便最大程度地利用可用的显示区域。
frame.addWindowListener(new java.awt.event.WindowAdapter() {//监听窗口事件,sceneControl必须有这个监听窗口事件
public void windowClosing(java.awt.event.WindowEvent e) {
sceneControl.dispose();
}
public void windowOpened(java.awt.event.WindowEvent e) {
openScene();//打开场景
scenetolayer();//场景窗口与图层管理器联动
}
});
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());//是将 JPanel 的布局管理器设置为 BorderLayout,以便使用 BorderLayout 的布局规则来摆放该面板上的组件。
//创建分割窗格
JSplitPane jSplitPane = new JSplitPane();//用于创建可拖动的分割窗格,可以将两个组件放置在水平或垂直方向上的分割线两侧。
jSplitPane.setDividerSize(10);//将设置分割窗格的分割线大小为 10 像素。
jSplitPane.setDividerLocation(260);// 将设置分割窗格的分割线位置为距离容器起始位置 260 像素的位置。
JSplitPane leftsplitPane = new JSplitPane();//创建左侧分割窗口
leftsplitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);//表示垂直分割,即将容器分割为上下两部分。
leftsplitPane.setDividerLocation(250);// 将设置分割窗格的分割线位置为距离容器起始位置 250 像素的位置。
/*
在左侧分割窗口的顶部窗口添加带有标签和线框的panel1,panel1里添加工作空间管理器控件
*/
JPanel panel1 = new JPanel();
panel1.setLayout(new BorderLayout());//是将 JPanel 的布局管理器设置为 BorderLayout,以便使用 BorderLayout 的布局规则来摆放该面板上的组件。
panel1.setBorder(new TitledBorder("工作空间管理器"));
panel1.add(workspaceTree);
leftsplitPane.setTopComponent(panel1);//在左侧分割窗口设置顶部组件
JTabbedPane jTabbedPane = new JTabbedPane();
// 将选项卡添加到 JTabbedPane
jTabbedPane.addTab("地图窗口", mapControl);
jTabbedPane.addTab("场景窗口", sceneControl);
jSplitPane.add(jTabbedPane, JSplitPane.RIGHT);//将选项卡容器加到右侧分割面板
/*
在左侧分割窗口的底部窗口添加带有标签和线框的panel2,panel2里添加图层管理器控件
*/
JPanel panel2 = new JPanel();
panel2.setLayout(new BorderLayout());//是将 JPanel 的布局管理器设置为 BorderLayout,以便使用 BorderLayout 的布局规则来摆放该面板上的组件。
panel2.setBorder(new TitledBorder("图层管理器"));
panel2.add(layersTree);
/*监听tab页面,若当前为地图窗口,则移除layer3DsTree,添加layersTree,使地图和二维图层树相关联。
若当前窗口为场景窗口,则移除layersTree,添加layer3DsTree,使场景和三维图层树相关联。
*/
jTabbedPane.addChangeListener(new ChangeListener() {//监听选项卡更改事件
public void stateChanged(ChangeEvent e) {
// 获取当前选中的选项卡索引
int selectedIndex = jTabbedPane.getSelectedIndex();
// 在选项卡被选择时执行你的操作
if(selectedIndex==0){
panel2.remove(layer3DsTree);
panel2.add(layersTree);
panel2.revalidate();//布局的重新计算
panel2.repaint();//布局的重绘
}else{
panel2.remove(layersTree);
panel2.add(layer3DsTree);
panel2.revalidate();
panel2.repaint();
}
}
});
leftsplitPane.setBottomComponent(panel2);//在左侧分割窗口设置底部组件
jSplitPane.add(leftsplitPane, JSplitPane.LEFT);//将leftsplitPane分割窗口添加到左侧分割面板
panel.add(jSplitPane, BorderLayout.CENTER);
frame.setContentPane(panel);//用于设置 JFrame 窗口的内容面板(content pane)的方法
// 显示窗口
frame.setVisible(true);
}
/**
* 打开工作空间
*/
private static void openWorkspace() {
WorkspaceConnectionInfo workspaceConnectionInfo = new WorkspaceConnectionInfo();
workspaceConnectionInfo.setType(WorkspaceType.SMWU);
workspaceConnectionInfo.setServer("D:/supermap/11.1.1/正式版/supermap-iobjectsjava-11.1.1-win-all/SampleData/World/World.smwu");
workspace = new Workspace();
workspace.open(workspaceConnectionInfo);
workspaceTree = new WorkspaceTree();
workspaceTree.setWorkspace(workspace);
}
/**
* 打开地图
*/
private static void openMap() {
mapControl = new MapControl();
mapControl.getMap().setWorkspace(workspace);
mapControl.getMap().open("世界地图");
mapControl.getMap().refresh();
}
/**
* 地图窗口与图层管理器窗口联动
*/
private static void maptolayer() {
layersTree = new LayersTree();
layersTree.setMap(mapControl.getMap());
}
/**
* 打开场景
*/
private static void openScene() {
sceneControl.getScene().setWorkspace(workspace);
sceneControl.getScene().open("场景");
sceneControl.getScene().refresh();
}
/**
* 场景关联图层窗口
*/
private static void scenetolayer() {
layer3DsTree = new Layer3DsTree();
layer3DsTree.setScene(sceneControl.getScene());
}
}
三、运行结果
![地图窗口](https://img-blog.csdnimg.cn/42462ceaa77a44698f17f7d2670ce986.png)
![](https://img-blog.csdnimg.cn/2424e82b60244285b1a51511ae318e92.png)