Skip to content

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 文件;

从本地安装插件后,使用效果如下;

资料

查看源码

基于 MIT 许可发布