SuperMap iDesktopX 11i 扩展开发之自定义启动程序

作者:贤

1. 背景

  SuperMap iDesktopX 是通过 SuperMap iObjects Java 核心库和 Java SE Development Kit(JDK)构建的一款企业级、插件式、跨平台桌面 GIS 应用与开发平台,可基于 Java 语言在 Windows 或 Linux 系统中进行扩展开发。

  SuperMap iDesktopX 应用程序是基于插件机制构建的,各个功能通过加载相应功能的插件实现,界面配置是插件 + 配置文件的方式。目前主要包含 2 种扩展开发的方式:1. 自定义启动程序扩展;2. 功能插件扩展。

  当程序启动时,后台需要一定的操作时间,在此期间,为了用户的更好体验,程序的启动界面可以友好的改善用户体验。本文主要介绍如何基于 SuperMap iDesktopX 自定义启动程序扩展开发。

2. 环境准备

  基于 SuperMap iDesktopX 进行扩展开发,所需的环境依赖均由 iDesktopX 提供,因此开发环境仅需要 iDesktopX 和 IDEA 足以满足需求。

软件 版本 下载地址 说明
SuperMap iDesktopX 11i 及其以上版本 SuperMap iDesktopX 下载地址 SuperMap iDesktopX 分别提供了安装包和精简绿色包 2 种,可根据实际项目需求下载合适的版本包
IntelliJ IDEA 2020.3.x 及其以上版本 IntelliJ IDEA 下载地址 IntelliJ IDEA 是 java 编程语言的集成开发环境,在业界被公认为最好的 Java 开发工具

3. 新建项目

  SuperMap iDesktopX 的启动程序有以下 2 种创建方式:

3.1. 通过 SuperMap iDesktopX 扩展插件模板创建

  • SuperMap iDesktopX 11i 视图 菜单栏中提供了 新建二次开发工程 功能,此功能可直接基于 iDesktopX 扩展开发模板快速创建二次开发工程项目。
    新建 iDesktopX 扩展开发项目.png

  • 基于 iDesktopX 扩展开发模板新建的项目结构如下所示:
    从 iDesktopX 11i 新建的扩展开发项目结构.png

  基于 iDesktopX 扩展开发模板新建的项目,在模板中已配置 iDesktopX 扩展开发所需的环境依赖,因此无需再额外对项目配置环境依赖,可直接使用。

3.2. IDEA 新建 iDesktopX 扩展开发项目

  • IDEA 新建 Java 空项目

    • 新建项目
      IDEA 新建项目.png

    • 配置 Java 版本
      IDEA 新建 Java 项目.png

    • 不选择模板,创建空项目
      IDEA 新建 Java 空项目.png

    • 空项目结构
      IDEA 新建 Java 空项目结构.png

    • 新建自定义包
      在 src 目录下新建包.png

    • 新建入口类
      在包中新建入口类.png

    • 新建入口函数
      在入口类中添加入口函数main.png

  • 配置 iDesktopX 扩展开发环境依赖

    • 配置 iDesktopX 扩展开发依赖库

        SuperMap iDesktopX 扩展开发需要共计需要 4 个依赖库配置,分别是:

      • %SuperMap iDesktopX%\bin
      • %SuperMap iDesktopX%\lib
      • %SuperMap iDesktopX%\bundles\idesktop_bundles
      • %SuperMap iDesktopX%\bundles\require_bundles

      配置 iDesktopX 扩展开发环境依赖.png

    • 配置程序打包

        由于是 iDesktopX 启动程序扩展开发,因此打包时直接将 jar 包输出到 %SuperMap iDesktopX% 根目录位置即可,无需再输出到 iDesktopX 插件目录 (%SuperMap iDesktopX%\bundles\plugin_bundles)
      自定义启动程序打包配置.png

4. 自定义启动界面

  SuperMap iDesktopX 提供了对应的接口便于用户自定义程序启动界面以满足实际项目需求,如以下代码,其中 CStartupDialog 类是自定义的启动界面

// 设置自定义启动界面
SplashScreenUtilities splashScreenUtilitiesInstance = SplashScreenUtilities.getSplashScreenUtilitiesInstance();
splashScreenUtilitiesInstance.setStartupDialog(new CStartupDialog());
package com.supermap.startup;

import com.supermap.desktop.core.StartupDialogParameters;
import com.supermap.desktop.core.startup.IStartupDialog;
import com.supermap.desktop.core.utilties.FontUtilities;
import com.supermap.desktop.core.utilties.PathUtilities;
import com.supermap.desktop.core.utilties.ThreadUtilties;

import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/**
 * 自定义 iDesktopX 11i 启动面板
 */
public class CStartupDialog extends JDialog implements IStartupDialog {
    
    

    private final JTextArea textArea;
    private boolean isDisposed = false;

    public CStartupDialog() {
    
    
        // 设置启动界面关闭功能
        addWindowListener(new WindowAdapter() {
    
    
            @Override
            public void windowClosed(WindowEvent e) {
    
    
                super.windowClosed(e);
                if (!isDisposed) {
    
    
                    System.exit(0);
                }
            }
        });
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

        setTitle("自定义启动界面");
        setBounds(0, 0, 600, 500);

        // 启动界面布局
        setLayout(new GridLayout(1, 2, 0, 0));
        JPanel leftPanel = new JPanel();
        add(leftPanel);
        JPanel rightPanel = new JPanel() {
    
    
            @Override
            protected void paintComponent(Graphics g) {
    
    
                super.paintComponent(g);

                // 绘制启动界面动画背景
                String iconPath = PathUtilities.getFullPathName("../resources/Frame/StartupIcon/Startup_Right100.gif");
                ImageIcon imageIcon = new ImageIcon(iconPath);
                Image image = imageIcon.getImage();
                g.drawImage(image, 0, 0, imageIcon.getIconWidth(), imageIcon.getIconHeight(), this);
            }
        };
        add(rightPanel);

        // 设置启动界面图标
        String iconPath = PathUtilities.getFullPathName("../resources/Frame/StartupIcon/Logo_32.png");
        ImageIcon imageIcon = new ImageIcon(iconPath);
        Image iconImage = imageIcon.getImage();
        setIconImage(iconImage);

        // 显示启动界面位置
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        Dimension screenSize = toolkit.getScreenSize();
        this.setLocation(screenSize.width / 2 - this.getWidth() / 2, screenSize.height / 2 - this.getHeight() / 2);

        // 设置启动界面日志输出文本框
        Font defaultFont = FontUtilities.getDefaultFont();
        textArea = new JTextArea();
        textArea.setForeground(Color.BLACK);
        textArea.setOpaque(false);
        textArea.setEditable(false);
        textArea.setFont(defaultFont);
        textArea.setLineWrap(false);
        textArea.setWrapStyleWord(false);

        if (StartupDialogParameters.isPluginInfoVisible()) {
    
    
            JScrollPane scrollPane = new JScrollPane(textArea);
            scrollPane.setPreferredSize(new Dimension(280, 450));
            leftPanel.add(scrollPane);
        }
    }

    @Override
    public void update(String text) {
    
    
        textArea.append(text + "\n");
        textArea.setCaretPosition(textArea.getText().length());
    }

    @Override
    public void showDialog() {
    
    
        setVisible(true);
        ThreadUtilties.executeAfterDesktopVisible(this::doDispose, 1);
    }

    @Override
    public void dispose() {
    
    
        super.dispose();
    }

    public void doDispose() {
    
    
        isDisposed = true;
        dispose();
    }
}

  以上代码实现的自定义启动界面效果如下,该自定义启动界面实现仅做示例,用户可根据实际项目情况
iDesktopX 自定义启动界面.png

5. 自定义启动后操作

  当 SuperMap iDesktopX 界面加载完成后,会触发 ThreadUtilties.executeAfterDesktopVisible 绑定的事件,用户可直接在该事件中实现指定逻辑执行,如下所示,当 iDesktopX 启动后,加载指定工作空间并打开场景

ThreadUtilties.executeAfterDesktopVisible(() -> {
    
    
    // 打开默认工作空间
    Application activeApplication = Application.getActiveApplication();
    Workspace workspace = activeApplication.getWorkspace();
    WorkspaceConnectionInfo workspaceConnectionInfo = new WorkspaceConnectionInfo();
    workspaceConnectionInfo.setServer("sampleData/3D/CBDDataset/CBD.smwu");
    workspaceConnectionInfo.setType(WorkspaceType.SMWU);
    workspace.open(workspaceConnectionInfo);

    // 默认打开当前工作空间中的第一个场景
    Scenes scenes = workspace.getScenes();
    String sceneName = scenes.get(0);
    SwingUtilities.invokeLater(() -> {
    
    
        IFormScene sceneForm = (IFormScene) FormUtilities.fireNewWindowEvent(WindowType.SCENE, sceneName);
        sceneForm.openScene(sceneName);
    });
});

iDesktopX 启动后自动打开指定工作空间场景.gif

6. 修改启动方式

  SuperMap iDesktopX 提供了 2 种启动方式:1. bat (Windows) / sh (Linux) 脚本启动;2. exe (Windows) 可执行程序启动。以 Windows 操作系统为例,下面分别介绍自定义启动程序在 2 种启动方式上的应用。

  • 修改 iDesktopX 启动脚本

      iDesktopX 根目录下提供了 startup.bat 启动脚本,该脚本中默认配置的是以同级目录的 iDesktop.jar 作为启动入口,因此当自定义启动程序 CStartup.jar 包打包后,直接修改 startup.bat 启动脚本内容即可。

      仅需修改 CLASSPATH 的启动 jar 包和 java 命令启动入口类配置,如下图所示:

    修改 iDesktopX 启动脚本.png

  • 将自定义启动程序打包成 exe 可执行文件

      将 jar 包打包成 exe 可执行文件的方式有多种,用户可根据项目实际情况选择合适的方式。这里选择一种轻量级的打包工具 Launch4j 进行介绍。

      提供的 Launch4j 下载 地址中包含 launch4j.zip 程序压缩包以及 launch4j.xml 配置模板。

    Launch4j下载包结构.png

    • launch4j.xml 文件放入 %SuperMap iDesktopX% 根目录

    • 双击运行 launch4j.exe 可执行程序

    • 导入 %SuperMap iDesktopX% 根目录下的 launch4j.xml 文件

    • 修改 Output fileJar runtime pathIcon 参数配置

      修改 Launch4j 参数配置.png

    • Launch4j 生成 exe 可执行文件后,可在 iDesktopX 根目录下双击执行

      Launch4j 生成的 exe 可执行文件.png

7. 总结

  本文详细介绍了如何基于 SuperMap iDesktopX 扩展开发自定义启动程序,从新建扩展开发到最终打包使用的完整流程,可供用户入门 iDesktopX 扩展开发自定义启动程序参考。

  此外,本教程还提供了根据上述教程开发的 SuperMap iDesktopX 11i 扩展开发之自定义启动程序 CStartup,也可以直接下载示例代码通过 IDEALaunch4j 编译打包,调试运行。

猜你喜欢

转载自blog.csdn.net/supermapsupport/article/details/131593343