作者:小傅哥
博客:https://bugstack.cn
原文:https://mp.weixin.qq.com/s/R8qvoSNyedVM95Ty8sbhgg
积淀、分享、成长,让本人和别人都能有所播种!
一、阐明
方向不对,致力徒劳!
总有人拿到产品的需要,就焦急开干,反正也懒的想开发中会产生啥,上线后多少人应用,管它三七二十一先堆起来代码看一看,反正能跑就行,无论代码还是你!
其实很多时候在编写代码前,所须要做的技术调研、架构设计、模块分层、数据结构、详细分析、计划评审等,与三七二十一那家伙
比照起来,如同都会显得有点慢。但这个看上去慢的过程,却能解决当前很多常见和麻烦的问题,比方产品需要迭代、业务流程变更、代码逻辑更改、线上异样排查。尽管看着慢,但这个积基树本的过程就像打地基一样,总得有一个稳固的根基,能力盖好整栋大楼。万丈高楼平地起,勿在浮沙筑高台
二、需要目标
如果你须要开发一个自定义性能的插件,无论是解决代码、辅助ORM生成、日志信息记录等,都会须要进行一个插件的性能配置进行初始化操作以及把对应性能展现到整个 IDEA 窗体中的左边栏或者下边栏中,这样能力满足一个插件的根本需要。
那么这样就须要在 IDEA 窗体 File -> Settings
中扩大本人的配置窗体,以及开发本人须要的 ToolWindow 嵌入到 IDEA 中(左侧、右侧、下侧),这里窗体的开发须要用到 Swing 但目前在 IDEA 中开发这样的性能只须要拖拽窗体就能够,还是蛮容易的。
那么接下来咱们以一个在 IDEA 中摸鱼看书的场景为案例,学习配置窗体和浏览窗体的性能实现。
三、案例开发
1. 工程构造
guide-idea-plugin-tool-window├── .gradle└── src ├── main │ └── java │ └── cn.bugstack.guide.idea.plugin │ └── factory │ │ ├── ReadFactory.java │ │ └── SettingFactory.java │ └── ui │ │ ├── ReadUI.java │ │ ├── ReadUI.form │ │ ├── SettingUI.java │ │ └── SettingUI.form │ └── Config ├── resources │ └── META-INF │ └── plugin.xml ├── build.gradle └── gradle.properties
- 源码获取:#公众号:
bugstack虫洞栈
回复:idea
即可下载全副 IDEA 插件开发源码
此工程次要波及两局部,在factory中一个是配置窗体、一个是浏览窗体,与之对应的两组UI的实现。最初 factory 类的实现都会配置到 plugin.xml 中进行应用,同时也是在 plugin.xml 中管制窗体地位和图标。
2. 创立 UI 窗体
2.1 创立形式
New -> Swing UI Designer -> GUI Form
- 在 Java 中创立窗体的形式次要有 AWT、Swing、JavaFx,因为 IDEA 应用 Swing 开发,所以这里创立 Swing 窗体的兼容性会更好。
- 那么这里 Swing 窗体的创立能够是本人手写窗体构造,也能够应用可视化拖拽的 GUI Form 如果你的窗体不简单,其实拖拽的形式就能够满足应用。
2.2 配置页窗体
public class SettingUI { private JPanel mainPanel; private JPanel settingPanel; private JLabel urlLabel; private JTextField urlTextField; private JButton urlBtn; public SettingUI() { // 给按钮增加一个抉择文件的事件 urlBtn.addActionListener(e -> { JFileChooser fileChooser = new JFileChooser(); fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); fileChooser.showOpenDialog(settingPanel); File file = fileChooser.getSelectedFile(); urlTextField.setText(file.getPath()); }); } public JComponent getComponent() { return mainPanel; } public JTextField getUrlTextField() { return urlTextField; }}
- 配置页窗体次要提供文章门路的抉择,这里须要用到的标签包含:JLabel、JTextField、JButton
- 在应用 GUI Form 创立完窗体后,就会呈现这样一个可视化的页面,右侧能够把各类标签拖到两头的面板中,左侧进行设置展现名称和属性名称。
- 最终这里的代码标签代码会展现到
SettingUI.java
中,而渲染内容会被暗藏,这样的形式也比拟不便管制一些自定义内容的增加,例如事件和新窗体等 - 另外在
SettingUI.java
中,还须要在构造函数增加一个按钮事件,用于关上文件选择器,把咱们须要关上的文件,设置到urlTextField
中。
2.3 浏览页窗体
public class ReadUI { private JPanel mainPanel; private JTextPane textContent; public JComponent getComponent() { return mainPanel; } public JTextPane getTextContent() { return textContent; }}
- 在窗体创立和配置页窗体是一样的,也是通过拖拽到面板中,用于展现门路文件内容。
- 你能够适当的增加一些其余按钮进去,比方翻页浏览、滚动条、字数展现等。
3. ToolWindow 工具框
为了把咱们本人实现的浏览窗体
放到整个 IDEA 右侧侧边栏中,咱们须要创立一个实现了 ToolWindowFactory
的接口,并把实现类配置到 plugin.xml 中
public class ReadFactory implements ToolWindowFactory { private ReadUI readUI = new ReadUI(); @Override public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) { // 获取内容工厂的实例 ContentFactory contentFactory = ContentFactory.SERVICE.getInstance(); // 获取 ToolWindow 显示的内容 Content content = contentFactory.createContent(readUI.getComponent(), "", false); // 设置 ToolWindow 显示的内容 toolWindow.getContentManager().addContent(content); // 全局应用 Config.readUI = readUI; }}
- 接口办法
ToolWindowFactory#createToolWindowContent
是须要本人工具框类实现的办法,在这个createToolWindowContent
办法中把本人的窗体ReadUI
实例化后填充进去即可。 - 增加窗体的贴补次要依赖于
ContentFactory.SERVICE.getInstance()
创立出 ContentFactory 并最终应用 toolWindow 增加窗体显示 UI 即可。 - 这里咱们额定的还增加了一个全局属性
Config.readUI
这是为了后续能够在配置窗体中应用这个 UI 进行设置文件内容。
4. Configurable 配置框
public class SettingFactory implements SearchableConfigurable { private SettingUI settingUI = new SettingUI(); @Override public @NotNull String getId() { return "test.id"; } @Override public @Nls(capitalization = Nls.Capitalization.Title) String getDisplayName() { return "test-config"; } @Override public @Nullable JComponent createComponent() { return settingUI.getComponent(); } @Override public boolean isModified() { return true; } @Override public void apply() throws ConfigurationException { String url = settingUI.getUrlTextField().getText(); // 设置文本信息 try { File file = new File(url); RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r"); randomAccessFile.seek(0); byte[] bytes = new byte[1024 * 1024]; int readSize = randomAccessFile.read(bytes); byte[] copy = new byte[readSize]; System.arraycopy(bytes, 0, copy, 0, readSize); String str = new String(copy, StandardCharsets.UTF_8); // 设置内容 Config.readUI.getTextContent().setText(str); } catch (Exception ignore) { } }}
- 实现自 SearchableConfigurable 接口的办法比拟多,包含:getId、getDisplayName、
createComponent
、isModified、apply
这些外面用于写逻辑实现的次要是createComponent
和apply
- createComponent 办法次要是把咱们本人创立的 UI 面板提供给 JComponent
- apply 是一个事件,当咱们点击实现配置的 OK、实现,时候就会触发到这个办法。在这个办法中咱们拿到文件的 URL 地址应用
RandomAccessFile
进行读取解析文件,并最终把文件内容展现到浏览窗体中Config.readUI.getTextContent().setText(str);
5. 配置 plugin.xml
<extensions defaultExtensionNs="com.intellij"> <!-- Add your extensions here --> <!-- 配置 File -> Settings -> Tools --> <projectConfigurable groupId="tools" displayName="My Test Config" id="test.id" instance="cn.bugstack.guide.idea.plugin.factory.SettingFactory"/> <!-- 窗体 (IDEA 界面右侧) --> <toolWindow id="Read-Book" secondary="false" anchor="right" icon="/icons/logo.png" factoryClass="cn.bugstack.guide.idea.plugin.factory.ReadFactory"/></extensions>
- 本次在 plugin.xml 中的次要配置内容就是 projectConfigurable 和 toolWindow,另外在 toolWindow 中还增加了一个 icon 的 logo,配置实现后就能够在 IDEA 页面展现出咱们的本人增加的窗体了。
四、插件测试
- 通过 Plugin 启动插件,这个时候会关上一个新的 IDEA 窗体,在这个新窗体中就能够看到咱们增加的性能了。
配置文件门路
- 点击抉择按钮,抉择你的文件地位,抉择后点击 OK
查看展现文件
- 确认好文件门路后,就能够再右侧栏看到本人的文件展现内容了。是不是在扩大些,就适宜你摸鱼了!?
五、总结
- 学习自定义开发UI,把UI填充到须要搁置的 IDEA 窗体地位,并在窗体中增加性能的流程步骤,其实次要包含三方面:Swing UI、Factory 实现类、plugin 配置。
- 在 plugin 配置中,次要包含如窗体ID、地位、icon图标、对应的实现类,如果不增加这些是不能失常展现窗体信息的。
- 另外能够以这个案例为根底,增加本人想实现的性能,比方让这个摸鱼看书的性能更加欠缺,能够反对不同类型的文件,甚至能够是 PDF 的浏览,以及你想看的书籍。
六、系列举荐
- IDEA 插件怎么开发?
- 如何公布Jar包到Maven核心仓库
- 12种 vo2dto 办法,就 BeanUtils.copyProperties 压测最拉胯!
- 炸!1024,小傅哥的博客降级啦,文章开源、反对PR,冲哇!
- 面经手册 · 开篇《面试官都问我啥》