• idea 插件开发记录


    前言:
    不要盲目的复制粘贴,我的版本比较高,很多语法不兼容!!!

    代码:github上可查看,欢迎start

    消息通知类,用于提示一些错误,或者警告

    Notification notification = new Notification(StaticString.GROUP_ID, StaticString.CONTENT, NotificationType.INFORMATION);
    Notifications.Bus.notify(notification);
    
    • 1
    • 2

    效果图:

    在这里插入图片描述

    弹窗通知,用于提示错误或警告(会阻碍idea的运行)

    Messages.showMessageDialog("内容", "标题", Messages.getInformationIcon());
    
    • 1

    效果图:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JBnZ9jKS-1659692757184)(/Users/mr.ahai/Library/Application Support/typora-user-images/image-20220804174825402.png)]

    创建一个自己的toolWindow,类似idea中的通知小铃铛之类的

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6bib4IrU-1659692757184)(/Users/mr.ahai/Library/Application Support/typora-user-images/image-20220805095301190.png)]

    创建窗体之后就可根据自己的需求进行组件拖拽

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tVK4leLi-1659692757184)(/Users/mr.ahai/Library/Application Support/typora-user-images/image-20220805095402343.png)]

    //创建一个自己的windowsFactory,之后实现createToolWindowContent方法,将自己创建的窗体添加到idea中
    public class TempPluginWindowsFactory implements ToolWindowFactory {
        @Override
        public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) {
            TempPluginUI tempPluginUI = new TempPluginUI(project, toolWindow);
            ContentFactory contentFactory = ContentFactory.getInstance();
            Content content = contentFactory.createContent(tempPluginUI.getPanel1(), "", false);
            toolWindow.getContentManager().addContent(content);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    //注意配置!!!,在这个extensions标签下添加toolWindows
        <extensions defaultExtensionNs="com.intellij">
            <toolWindow factoryClass="com.example.tempplugin.factory.TempPluginWindowsFactory" id="tempPluginWindowsFactory" anchor="right" icon="AllIcons.Actions.Colors" />
        extensions>
    
    • 1
    • 2
    • 3
    • 4

    效果图:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Oc3aroIn-1659692757185)(/Users/mr.ahai/Library/Application Support/typora-user-images/image-20220805095850890.png)]

    添加一个表格在toolwindows里面

    请在JScrollPane下面添加table,否则会不显示table的header的

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qsr03vob-1659692757185)(/Users/mr.ahai/Library/Application Support/typora-user-images/image-20220805154929061.png)]

    添加完成之后,在创建好的UI类中添加数据
    public class TempData {
        /**
         * 创建一个表头
         */
        public static String[] HEADER = {"First Name", "Last Name", "Sport", "# of Years", "Vegetarian"};
        /**
         * 创建数据便于演示
         */
        public static Object[][] TABLE_DATA = {
                {"Kathy", "Smith", "Snowboarding", 5, false},
                {"John", "Doe", "Rowing", 3, true},
                {"Sue", "Black", "Knitting", 2, false},
                {"Jane", "White", "Speed reading", 20, true},
                {"Joe", "Brown", "Pool", 10, false}
        };
        public static DefaultTableModel DEFAULT_TABLE_MODEL = new DefaultTableModel(TABLE_DATA, HEADER);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
     // 将数据放入表格中
    table1.setModel(TempData.DEFAULT_TABLE_MODEL);
    table1.setVisible(true);
    
    • 1
    • 2
    • 3

    效果图:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nwQkSpTO-1659692757185)(/Users/mr.ahai/Library/Application Support/typora-user-images/image-20220805154817427.png)]


    使用idea插件操作编辑器中的内容,实现内容的修改

    操作编辑器的方法如下:
    package com.example.tempplugin.util;
    
    import com.intellij.openapi.actionSystem.ActionManager;
    import com.intellij.openapi.actionSystem.AnActionEvent;
    import com.intellij.openapi.actionSystem.CommonDataKeys;
    import com.intellij.openapi.command.WriteCommandAction;
    import com.intellij.openapi.editor.Document;
    import com.intellij.openapi.editor.Editor;
    import com.intellij.openapi.editor.SelectionModel;
    import com.intellij.openapi.editor.richcopy.settings.RichCopySettings;
    import com.intellij.openapi.project.Project;
    import com.intellij.openapi.ui.Messages;
    
    import java.awt.*;
    import java.awt.datatransfer.Clipboard;
    import java.awt.datatransfer.DataFlavor;
    import java.awt.datatransfer.StringSelection;
    import java.awt.datatransfer.Transferable;
    
    /**
     * 用于编辑选中的文本
     *
     * @author mr.ahai
     */
    public class EditTextUtil {
    
        private EditTextUtil() {
        }
    
        /**
         * 将选中的内容放到剪切板中
         *
         * @return 返回选中的内容
         */
        public static String getSysClipboardText() {
            String ret = "";
            Clipboard sysClip = Toolkit.getDefaultToolkit().getSystemClipboard();
            //获取剪切板中的内容
            Transferable contents = sysClip.getContents(null);
            if (contents != null) {
                //检查是否是文本类型
                if (!contents.isDataFlavorSupported(DataFlavor.stringFlavor)) {
                    return ret;
                }
                try {
                    ret = (String) contents.getTransferData(DataFlavor.stringFlavor);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return ret;
        }
    
    
        /**
         * 将剪切板的内容设为空
         *
         * @param writeText 之前剪切板存在的内容
         */
        public static void setSysClipboardText(String writeText) {
            Clipboard systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
            StringSelection stringSelection = new StringSelection(writeText);
            systemClipboard.setContents(stringSelection, null);
        }
    
        /**
         * 替换选中的文字
         *
         * @param e AnActionEvent
         */
        public static void replaceMsg(AnActionEvent e) {
            RichCopySettings settings = RichCopySettings.getInstance();
            settings.setEnabled(true);
            ActionManager.getInstance().getAction("EditorCopy").actionPerformed(e);
            settings.setEnabled(settings.isEnabled());
            String sysClipboardText = getSysClipboardText();
            //弹出一个弹框
            Messages.showMessageDialog(sysClipboardText, "您确定要替换吗", Messages.getInformationIcon());
            String tempText = "我是要替换的文字!!!!!";
            Project project = e.getData(CommonDataKeys.PROJECT);
            Editor editor = e.getData(CommonDataKeys.EDITOR);
            if (null == editor) {
                return;
            }
            e.getPresentation().setVisible(project != null && editor.getSelectionModel().hasSelection());
            Document document = editor.getDocument();
            SelectionModel selectionModel = editor.getSelectionModel();
            int start = selectionModel.getSelectionStart();
            int end = selectionModel.getSelectionEnd();
            Runnable runnable = () -> document.replaceString(start, end, tempText);
            WriteCommandAction.runWriteCommandAction(project, runnable);
            selectionModel.removeSelection();
            setSysClipboardText(sysClipboardText);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
  • 相关阅读:
    南科大计算机系:将开源和企业引入计算机课程教学
    【个人博客公网访问】使用Cpolar+Emlog在Ubuntu上轻松搭建个人博客公网访问
    比特币中的符文是什么?
    免费领取源码-小程序+spring boot流浪动物救助系统 12783
    倍福PLC和C#通过ADS通信传输String数组类型变量
    【数据结构入门_链表】 Leetcode 21. 合并两个有序链表
    并发通信(网络进程线程)
    盛最多水的容器
    前端开发新趋势:Web3、区块链与虚拟现实
    QT:编译opencv4.5.3
  • 原文地址:https://blog.csdn.net/weixin_43170526/article/details/126182692