作者:贤
SuperMap iDesktopX
是通过 SuperMap iObjects Java
核心库和 Java SE Development Kit(JDK)构建的一款企业级、插件式、跨平台桌面 GIS 应用与开发平台,可基于 Java 语言在 Windows 或 Linux 系统中进行扩展开发。
SuperMap iDesktopX
应用程序是基于插件机制构建的,各个功能通过加载相应功能的插件实现,界面配置是插件 + 配置文件的方式。目前主要包含 2 种扩展开发的方式:1. 自定义启动程序扩展;2. 功能插件扩展。
当程序启动时,后台需要一定的操作时间,在此期间,为了用户的更好体验,程序的启动界面可以友好的改善用户体验。本文主要介绍如何基于 SuperMap iDesktopX
自定义启动程序扩展开发。
基于 SuperMap iDesktopX
进行扩展开发,所需的环境依赖均由 iDesktopX 提供,因此开发环境仅需要 iDesktopX 和 IDEA 足以满足需求。
软件 | 版本 | 下载地址 | 说明 |
---|---|---|---|
SuperMap iDesktopX | 11i 及其以上版本 | SuperMap iDesktopX 下载地址 | SuperMap iDesktopX 分别提供了安装包和精简绿色包 2 种,可根据实际项目需求下载合适的版本包 |
IntelliJ IDEA | 2020.3.x 及其以上版本 | IntelliJ IDEA 下载地址 | IntelliJ IDEA 是 java 编程语言的集成开发环境,在业界被公认为最好的 Java 开发工具 |
SuperMap iDesktopX
的启动程序有以下 2 种创建方式:
基于 iDesktopX 扩展开发模板新建的项目,在模板中已配置 iDesktopX 扩展开发所需的环境依赖,因此无需再额外对项目配置环境依赖,可直接使用。
IDEA 新建 Java 空项目
配置 iDesktopX 扩展开发环境依赖
配置 iDesktopX 扩展开发依赖库
SuperMap iDesktopX
扩展开发需要共计需要 4 个依赖库配置,分别是:
配置程序打包
由于是 iDesktopX 启动程序扩展开发,因此打包时直接将 jar 包输出到 %SuperMap iDesktopX% 根目录位置即可,无需再输出到 iDesktopX 插件目录 (%SuperMap iDesktopX%\bundles\plugin_bundles)
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();
}
}
以上代码实现的自定义启动界面效果如下,该自定义启动界面实现仅做示例,用户可根据实际项目情况
当 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);
});
});
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 命令启动入口类配置,如下图所示:
将自定义启动程序打包成 exe 可执行文件
将 jar 包打包成 exe 可执行文件的方式有多种,用户可根据项目实际情况选择合适的方式。这里选择一种轻量级的打包工具 Launch4j 进行介绍。
提供的 Launch4j 下载 地址中包含 launch4j.zip 程序压缩包以及 launch4j.xml 配置模板。
本文详细介绍了如何基于 SuperMap iDesktopX
扩展开发自定义启动程序,从新建扩展开发到最终打包使用的完整流程,可供用户入门 iDesktopX 扩展开发自定义启动程序参考。
此外,本教程还提供了根据上述教程开发的 SuperMap iDesktopX 11i 扩展开发之自定义启动程序 CStartup,也可以直接下载示例代码通过 IDEA 和 Launch4j 编译打包,调试运行。