IDEA 插件开发入门
背景
记得刚工作没两年的时候,团队在做一个后端组件化的系统,其中有一项就是需要在内置到 IDEA 中操作,这里需要结合插件来做。现如今公司有同事开发了几款非常好用的插件,例如 docker 环境 debug,远程热部署,我就彻底心痒痒了。学习到新的知识,总能够令我愉悦~
目标
整个花活,写个 IDEA 插件,点击就能看妹子图。😏😏
涉及到 UI 的制作,事件的触发,已经网络请求,挺好~
准备
JDK: 1.8 IDEA: 2020.1 版本 IDEA 插件:Plugin DevKit
由于编写 IDEA 插件使用的 JDK 版本,取决与 IDEA 的版本,JDK 1.8 的 IDEA 需要不高于 2020.3
关键步骤
新建插件项目
新建 GUI 界面
怎么简单怎么来,直接使用 IDEA 自带的 GUI 可视化编辑工具即可。
新建 Action
Action 就是触发插件的位置,我这里选在了 ToolbarRunGroup 也就是“调试&运行”那个位置的最后边。
编写业务逻辑
自定义 JPanel,因为 swing 没有直接展示图片的组件,😵😵
java
public class ImagePanel extends JPanel {
private BufferedImage image;
public void setImage(String imageUrl) {
try {
InputStream is = Jsoup.connect(imageUrl)
.ignoreContentType(true)
.execute()
.bodyStream();
this.image = ImageIO.read(is);
System.out.println("------------------------ setImage ------------------------");
System.out.println(imageUrl);
System.out.println(image.getWidth() + "," + image.getHeight());
System.out.println(getWidth() + "," + getHeight());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (Objects.nonNull(image)) {
// 计算居中的 x 和 y 坐标
double scaleW = getWidth() * 1.0 / image.getWidth();
double scaleH = getHeight() * 1.0 / image.getHeight();
double scale = Math.min(scaleW, scaleH);
int w2 = (int) (image.getWidth() * scale);
int h2 = (int) (image.getHeight() * scale);
int x = (getWidth() - w2) / 2;
int y = (getHeight() - h2) / 2;
// 进行图片缩放,自适应屏幕
g.drawImage(image, x, y, w2, h2, this);
System.out.println("------------------------ paintComponent ------------------------");
System.out.println(x + "," + y + "," + (x + w2) + "," + (y + h2) + "," + scale);
System.out.println(image.getWidth() + "," + image.getHeight());
System.out.println(getWidth() + "," + getHeight());
System.out.println(getParent().getWidth() + "," + getParent().getHeight());
}
}
}
再就是直接添加到 GUI 中,在点击 OK 时,请求接口随机展示一张图片;
java
public class MainDialog extends JDialog {
//...
private void onOK() {
try {
int page = ThreadLocalRandom.current().nextInt(100);
String result = Jsoup.connect("https://api.pexels.com/v1/search?query=girl&size=1&page=" + page)
.header("Authorization", "VPk4DcECbltzTvTzJ0yq6isHn8g24Q3UQHWRGPth2BPzMi9eDx5wDHJF")
.ignoreContentType(true)
.get()
.text();
System.out.println(result);
ApiResult apiResult = JSON.parseObject(result, ApiResult.class);
String url = apiResult.getPhotos().get(0).getSrc().getLarge();
paneImage.setImage(url);
// 重绘
paneImage.repaint();
} catch (IOException e) {
e.printStackTrace();
}
}
//...
}
打包安装
打包插件,得到 zip 文件;
从本地安装插件后,使用效果如下;