SuperMap iObjects Java组件开发——在IntelliJ IDEA中创建SuperMap的UI界面

目录

前言

一、实现思路

1.1 创建顶级容器

1.2 设置布局管理器

1.3 添加监听事件

1.3.1 监听JFrame窗口

1.3.2 监听JTabbedPane选项卡

1.4 显示GUI界面

1.5 加载数据并显示

1.5.1 打开工作空间

1.5.2 打开地图

1.5.3 地图与图层相关联

1.5.4 打开场景

1.5.5 场景与图层相关联

二、完整代码

三、运行结果


前言

        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());
    }

}

三、运行结果

地图窗口
3.1 地图窗口界面显示
3.2 场景窗口界面显示

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值