在IntelliJIDEA中,开发⼀个摸鱼看书插件
沉淀、分享、成长,让⾃⼰和他⼈都能有所收获!
⼀、说明
⽅向不对,努⼒⽩费!
总有⼈拿到产品的需求,就着急开⼲,反正也懒的想开发中会发⽣啥,上线后多少⼈使⽤,管它三七⼆⼗⼀先堆起来代码看⼀看,反正能跑就⾏,⽆论代码还是你!
其实很多时候在编写代码前,所需要做的技术调研、架构设计、模块分层、数据结构、详细分析、⽅案评审等,与三七⼆⼗⼀那家伙对⽐起来,好像都会显得有点慢。但这个看上去慢的过程,却能解决以后很多常见和⿇烦的问题,⽐如产品需求迭代、业务流程变更、代码逻辑更改、线上异常排查。虽然看着慢,但这个积基树本的过程就像打地基⼀样,总得有⼀个稳定的根基,才能盖好整栋⼤楼。万丈⾼楼平地起,勿在浮沙筑⾼台
⼆、需求⽬的
如果你需要开发⼀个⾃定义功能的插件,⽆论是处理代码、辅助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
│└── l
├── adle
└── gradle.properties
源码获取:#:bugstack⾍洞栈回复:idea 即可下载全部 IDEA 插件开发源码
此⼯程主要涉及两部分,在factory中⼀个是配置窗体、⼀个是阅读窗体,与之对应的两组UI的实现。最后 factory 类的实现都会配置到l 中进⾏使⽤,同时也是在 l 中控制窗体位置和图标。
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 = SelectedFile();
urlTextField.Path());
});
}
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开发安卓app教程为了把我们⾃⼰实现的阅读窗体放到整个 IDEA 右侧侧边栏中,我们需要创建⼀个实现了 ToolWindowFactory 的接⼝,并把实现类配置到l 中
public class ReadFactory implements ToolWindowFactory {
private ReadUI readUI = new ReadUI();
@Override
public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) {
// 获取内容⼯⼚的实例
ContentFactory contentFactory = Instance();
// 获取 ToolWindow 显⽰的内容
Content content = Component(), "", false);
// 设置 ToolWindow 显⽰的内容
// 全局使⽤
}
}
接⼝⽅法 ToolWindowFactory#createToolWindowContent 是需要⾃⼰⼯具框类实现的⽅法,在这个 createToolWindowContent ⽅法中把⾃⼰的窗体 ReadUI 实例化后填充进去即可。
添加窗体的补助主要依赖于 Instance() 创建出 ContentFactory 并最终使⽤ toolWindow 添加窗体显⽰ UI 即可。
这⾥我们额外的还添加了⼀个全局属性 adUI 这是为了后续可以在配置窗体中使⽤这个 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() {
Component();
}
@Override
public boolean isModified() {
return true;
}
@Override
public void apply() throws ConfigurationException {
String url = UrlTextField().getText();
// 设置⽂本信息
try {
File file = new File(url);
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r");
randomAccessFile.seek(0);
byte[] bytes = new byte[1024 * 1024];
int readSize = ad(bytes);
byte[] copy = new byte[readSize];
System.arraycopy(bytes, 0, copy, 0, readSize);
String str = new String(copy, StandardCharsets.UTF_8);
/
/ 设置内容
} catch (Exception ignore) {
}
}
}
实现⾃ SearchableConfigurable 接⼝的⽅法⽐较多,包括:getId、getDisplayName、createComponent、isModified、apply 这些⾥⾯⽤于写逻辑实现的主要是 createComponent 和 apply
createComponent ⽅法主要是把我们⾃⼰创建的 UI ⾯板提供给 JComponent
apply 是⼀个事件,当我们点击完成配置的 OK、完成,时候就会触发到这个⽅法。在这个⽅法中我们拿到⽂件的 URL 地址使⽤RandomAccessFile 进⾏读取解析⽂件,并最终把⽂件内容展⽰到阅读窗体中 TextContent().setText(str);
5. 配置 l
<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>
本次在 l 中的主要配置内容就是 projectConfigurable 和 toolWindow,另外在 toolWindow 中还添加了⼀个 icon 的 logo,配置完成后就可以在 IDEA 页⾯展⽰出我们的⾃⼰添加的窗体了。
四、插件测试
通过 Plugin 启动插件,这个时候会打开⼀个新的 IDEA 窗体,在这个新窗体中就可以看到我们添加的功能了。
配置⽂件路径
点击选择按钮,选择你的⽂件位置,选择后点击 OK
查看展⽰⽂件
确认好⽂件路径后,就可以再右侧栏看到⾃⼰的⽂件展⽰内容了。是不是在扩展些,就适合你摸鱼了!?
五、总结
学习⾃定义开发UI,把UI填充到需要放置的 IDEA 窗体位置,并在窗体中添加功能的流程步骤,其实主要包括三⽅⾯:Swing UI、Factory 实现类、plugin 配置。
在 plugin 配置中,主要包括如窗体ID、位置、icon图标、对应的实现类,如果不添加这些是不能正常展⽰窗体信息的。
另外可以以这个案例为基础,添加⾃⼰想完成的功能,⽐如让这个摸鱼看书的功能更加完善,可以⽀持不同类型的⽂件,甚⾄可以是 PDF 的阅读,以及你想看的书籍。
六、系列推荐

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。