IDEA插件开发,自定义配置-持久化配置数据

从零开发BurpSuite插件:构建自定义HTTP日志分析器 在网络安全渗透测试领域,BurpSuite作为核心的Web漏洞扫描与代理工具,其强大的可扩展性允许开发者通过插件深度定制功能。插件开发基于Java语言,通过实现Burp Extender API,能够与BurpSuite的核心事件模型(如HTTP流量捕获)进行交互,从而实现对请求/响应的实时监听与处理。这项技术的核心价值在于,它能将通用的安全测试需求(如流量审计、敏感信息检索、攻击模式分析)转化为自动化、可视化的工程实践,极大地提升了安全研究员的工作效率。具体到应用场景,开发者可以构建诸如自定义日志分析器之 阅读详情

目录

一.添加配置界面

1、添加三个必要文件

2、各文件详解及代码示例

①CodeChronoSettings.java 

②CodeChronoSettingsComponent

③CodeChronoSettingsConfigurable

3、配置界面所在位置

4、国际化支持

二.使用配置参数

三.成果展示

四.参考链接


插件可以创建和存储自定义设置,以使用IntelliJ平台持久性模型的方式捕获其配置。

设置可以影响不同级别的范围。本文档介绍在项目和应用程序(或全局、IDE)级别添加自定义设置

一.添加配置界面

1、添加三个必要文件

CodeChronoSettings :持久化配置类
CodeChronoSettingsComponent :组件类,用于构建对话框面板,界面UI。
CodeChronoSettingsConfigurable:定义配置面板,将界面UI注入设置中,并重写保存、重置、是否修改等方法

2、各文件详解及代码示例

①CodeChronoSettings.java 

  • 实现接口PersistentStateComponent
  • @State:指定了组件的名称(name = "codechrono")和存储配置的XML文件名(storages = @Storage("codechrono-settings.xml"))。
  • @Service:声明这是一个服务组件,级别为APP,意味着它在IDEA应用程序级别上可用。
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.Service;
import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;

/**
 * @author Codechrono
 * 持久化插件配置文件
 */
@State(
        name = "codechrono",
        storages = @Storage("codechrono-settings.xml")
)
//​如果没有使用轻型服务 @Service,则必须在plugin.xml文件中将持久化数据类声明为ServiceEP
@Service(Service.Level.APP)

​
public final class CodeChronoSettings implements PersistentStateComponent<CodeChronoSettings.State> {

    public static class State {
        @NonNls
        public int days = 14;
        public String fielRegx = ".*\\.(txt|sql)$";
        public String projectRegx = "demo$|demo$";
    }

    private State myState = new State();

    public static CodeChronoSettings getInstance() {
        return ApplicationManager.getApplication().getService(CodeChronoSettings.class);
    }

    /**
     * 点击OK的时候会执行该方法,用于获取当前的状态
     * 该方法返回的状态会被保存到对应的文件中
     * @return
     */
    @Override
    public State getState() {
        return myState;
    }

    /**
     * 该方法会在插件启动的时候执行,用于加载状态
     */
    @Override
    public void loadState(@NotNull State state) {
        myState = state;
    }

}

②CodeChronoSettingsComponent

  1. 初始化UI组件,添加监听器,并获取主面板
import com.intellij.ui.components.JBLabel;
import com.intellij.ui.components.JBTextField;
import com.intellij.util.ui.FormBuilder;

import javax.swing.*;

/**
 * @author codechrono
 * 组件类,用于构建和配置设置对话框中的面板。
 */
public class CodeChronoSettingsComponent {

    private final JPanel mainPanel;
    private final JBTextField fileRegxText = new JBTextField();
    private final JBTextField projectRegxText = new JBTextField();
    private final JRadioButton day14RButton = new JRadioButton("14天");
    private final JRadioButton day30RButton = new JRadioButton("30天");
    private final JRadioButton dayCustomizeRButton = new JRadioButton("自定义天数");
    private final IntegerTextField inputCustomizeDayText = new IntegerTextField();
    private final ButtonGroup group = new ButtonGroup();


    public CodeChronoSettingsComponent() {
        initUIComponents();
        addListeners();

        mainPanel = getMainPanel();
    }

    /**
     * 获取首选的焦点组件
     */

    public JComponent getPreferredFocusedComponent() {
        return fileRegxText;
    }

    public JPanel getPanel() {
        return mainPanel;
    }

    public void reset(CodeChronoSettings.State state) {
        // 重置组件状态的代
        fileRegxText.setText(state.fielRegx);
        projectRegxText.setText(state.projectRegx);

        if (state.days == 14) {
            group.setSelected(day14RButton.getModel(), true);
            inputCustomizeDayText.setEnabled(false);
        } else if (state.days == 30) {
            group.setSelected(day30RButton.getModel(), true);
            inputCustomizeDayText.setEnabled(false);
        } else {
            group.setSelected(dayCustomizeRButton.getModel(), true);
            inputCustomizeDayText.setText(String.valueOf(state.days));
            inputCustomizeDayText.setEnabled(true);
        }
    }

    public void apply(CodeChronoSettings.State state) {
        // 这里可以添加应用组件状态的代码,例如:
        state.fielRegx = fileRegxText.getText();
        state.projectRegx = projectRegxText.getText();
        state.days = currentDays();
        CodeChronoSettings.getInstance().loadState(state);

    }

    /**
     * 控件值是否为默认值
     *
     * @param state
     * @return
     */
    public boolean isDefault(CodeChronoSettings.State state) {
        if (fileRegxText.getText().equals(state.fielRegx) && projectRegxText.getText().equals(state.projectRegx)
                && currentDays() == state.days) {
            return true;
        }
        return false;
    }

    /**
     * 初始化组件样式
     */

    private void initUIComponents() {
        group.add(day14RButton);
        group.add(day30RButton);
        group.add(dayCustomizeRButton);
        inputCustomizeDayText.setEnabled(false);
        group.setSelected(day14RButton.getModel(), true);

        fileRegxText.setToolTipText("请输入正则表达式,例如:\\.(txt|sql)$");
        projectRegxText.setToolTipText("请输入正则表达式,例如:demo$|demo$");
    }

    private JPanel getMainPanel() {
        return FormBuilder.createFormBuilder()
                .addLabeledComponent(new JBLabel("文件过滤:"), fileRegxText, 1, false)
                .addLabeledComponent(new JBLabel("项目过滤:"), projectRegxText, 1, false)
                .addLabeledComponent(new JBLabel("本地数据存储天数:"), day14RButton, 1, false)
                .addLabeledComponent(new JBLabel(""), day30RButton, 1, false)
                .addLabeledComponent(new JBLabel(""), dayCustomizeRButton, 1, false)
                .addLabeledComponent(new JBLabel("自定义天数:"), inputCustomizeDayText, 1, false)
                .addComponentFillVertically(new JPanel(), 0)
                .getPanel();
    }

    /**
     * 组件添加监听事件
     */
    public void addListeners() {
        dayCustomizeRButton.addActionListener(e -> dayRbuttonChangeAction());
        day14RButton.addActionListener(e -> dayRbuttonChangeAction());
        day30RButton.addActionListener(e -> dayRbuttonChangeAction());
    }

    /**
     * 自定义天数按钮事件处理
     */
    private void dayRbuttonChangeAction() {
        if (dayCustomizeRButton.isSelected()) {
            inputCustomizeDayText.setEnabled(true);
        } else {
            inputCustomizeDayText.setEnabled(false);
        }
    }

    /**
     * 当前选择的天数
     */
    private int currentDays() {
        int days = 14;
        if (day14RButton.isSelected()) {
            days = 14;
        } else if (day30RButton.isSelected()) {
            days = 30;
        } else if (dayCustomizeRButton.isSelected()) {
            days = Integer.parseInt(inputCustomizeDayText.getText());
        }
        return days;
    }
}

③CodeChronoSettingsConfigurable

  • 实现接口Configurable
package com.codechrono.idea.plugin.config;

import com.intellij.openapi.options.Configurable;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.Nullable;

import javax.swing.*;
import java.util.Objects;

/**
 * @author codechrono
 * Configurable 用于在 IDEA 设置中展示一个配置面板,它实现了 Configurable 接口。
 */
final class CodeChronoSettingsConfigurable implements Configurable {

  private CodeChronoSettingsComponent codeChronoSettingsComponent;

  @Nls(capitalization = Nls.Capitalization.Title)
  @Override
  public String getDisplayName() {
    return " CodeChrono";
  }

  /**
   * 获取首选聚焦组件。
   * @return
   */
  @Override
  public JComponent getPreferredFocusedComponent() {
    return codeChronoSettingsComponent.getPreferredFocusedComponent();
  }

  @Nullable
  @Override
  public JComponent createComponent() {
    codeChronoSettingsComponent = new CodeChronoSettingsComponent();
    return codeChronoSettingsComponent.getPanel();
  }

  /**
   * 检查设置是否被修改。
   * @return
   */
  @Override
  public boolean isModified() {
    CodeChronoSettings.State state =
            Objects.requireNonNull(CodeChronoSettings.getInstance().getState());
    return !codeChronoSettingsComponent.isDefault(state);
  }

  @Override
  public void apply() {
    CodeChronoSettings.State state =
            Objects.requireNonNull(CodeChronoSettings.getInstance().getState());
    codeChronoSettingsComponent.apply( state);

  }

  @Override
  public void reset() {
    CodeChronoSettings.State state =
            Objects.requireNonNull(CodeChronoSettings.getInstance().getState());
    codeChronoSettingsComponent.reset(state);

  }

  @Override
  public void disposeUIResources() {
    codeChronoSettingsComponent = null;
  }

}

3、配置界面所在位置

plugin.xml文件 extensions节点

 <extensions defaultExtensionNs="com.intellij">
    <!--   配置界面   -->
    <!-- parentId配置界面在哪个菜单下,instance指定配置界面的类-->
    <applicationConfigurable parentId="tools" instance="com.codechrono.idea.plugin.config.CodeChronoSettingsConfigurable"
                                 id="CodeChrono.Config"
                                 displayName="CodeChrono"/>
  </extensions>

4、国际化支持

IDEA插件开发,国际化处理_idea 国际化插件

二.使用配置参数

private static CodeChronoSettings.State state = Objects.requireNonNull(CodeChronoSettings.getInstance().getState());

/**
 * 清除历史数据,保留最近14天数据
 */
private static void clearHistory() {
    long timestamp = System.currentTimeMillis() - (long) state.days * 24 * 60 * 60 * 1000;
    editRecordInterface.deleteByDate(timestamp);
}

三.成果展示

四.参考链接

官方文档-设置指南-包含代码示例

官方demo-setting-GitHub

官方-组件数据持久化

Vivado工程备份实战:两种方法快速迁移Block Design(附路径避坑指南) 本文详细介绍了Vivado工程中Block Design(BD)备份与迁移的两种核心方法:文件夹直接复制法与TCL脚本生成法。针对FPGA工程师在项目迁移或团队协作时常见的IP丢失、路径报错等问题,提供了从原理到实战的操作指南与路径避坑策略,确保设计可复现与高效协作。 阅读详情

相关推荐

AD9361 Fast Lock实战:Python脚本自动生成Profile寄存器配置(附完整代码)

本文详细介绍了利用Python脚本实现AD9361 Fast Lock Profile寄存器自动化配置的实战方案。通过解析频率合成公式、VCO约束及查表机制,脚本能根据目标频率一键生成完整的16进制寄存器序列,大幅提升射频系统开发中多频点切换的效率和准确性,并支持CSV、JSON、C头文件等多种输出格式,便于与FPGA/嵌入式系统集成。

weixin_29194693的博客 475

Maven在IDEA中自定义配置介绍以及配置环境全套完整教程

此处的第二个localRepository可以设置我们repository(本地仓库的默认位置),还可以设置Maven项目中下载依赖的网址,一般采用国内的镜像网站,公司中也有自己的私服可以在添加一个mirror标签,换一下公司的那些子标签就行。做法:可以在Maven解压文件中的conf文件夹中设置settings.xml的位置,此处由于我们上面的包解压的路径上面说了,所以这个位置就设置为:D:\Maven\apache-maven-3.3.3\conf\settings.xm。

m0_69270622的博客 2317

数通基础(基本网络通信原理、IP地址如何配置、DHCP、DNS域名系统、路由技术基础、静态路由 、TCP和UDP、vlan虚拟局域网、trunk、三层交换)

我们知道了1、电脑开机,通过dhcp获取ip地址2、电脑输入域名,www.baidu.com电脑把www.baidu.com发到自己的dns服务器3、dns服务器把域名解析成对应的ip地址4、电脑向百度服务器发送一个请求。

qq_53235556的博客 6481

自制idea插件

添加action位置的Group id,有很多,这里我使用了GenerateGroup,即添加到Generate中,如果想要了解更多的group id,可以添加IDEA Plugin DevKit Helper插件,在idea上显示的名称,比如我这里是在Generate中加的插件action,所以text填的是Demo,和Generate显示的一样。表示在代码中具体实现的配置类,比如我的就是org.example.demo.MySettingsConfigurable,这个类。

weixin_43185154的博客 3130

Qt6导入QtChart绘制图表(添加组件)

我在按照大佬们的说明添加QtChart时发现,我的电脑上并不能正确的添加QtChart并编译通过,所以在综合了两位大佬的说明又自己探索了一番后,正确编译通过,分享出来,以便同志们节省一些时间。

Nuaa0719301zyx的博客 2951

无人机飞控算法开发实战:从零到一构建企业级飞控系统

本文系统介绍了无人机飞控算法开发的完整流程,包括飞行动力学模型建立、传感器校准与数据融合、主流控制算法实现(PID、ADRC、EKF)以及企业级飞控系统架构设计。通过结合开源飞控框架(如PX4)和实际工程经验,提供了完整的代码实现示例,帮助学者从零开始掌握无人机飞控开发的核心技术。文中详细讲解了四旋翼无人机的动力学模型、传感器校准方法、EKF状态估计算法、PID和ADRC控制算法的实现,以及MAVLink通信协议的集成。最后,总结了完整的飞控系统开发流程和未来发展趋势。

全栈 3402

idea自定义配置文件快捷生成MyBatis核心配置文件

平时写项目的时候MyBatis老是要去百度或者其他地方复制粘贴,十分麻烦,可不可以利用idea的特性添加一个自定义的配置文件快捷创建呢?

u011005040的博客 1172

IMX335摄像头原理图设计,已量产

从工程组织上看,IMX335 模组和 IMX415 模组属于同一类产品:核心矛盾不是外设多,而是高速图像链路、电源域和调试接口要同时兼顾。ATK-MCIMX335 这张图的结构也很直接,三路 LDO、本地 24MHz 可选时钟、4-lane MIPI 数据对和一组主板侧标准接口,构成了一张非常典型的量产摄像头子板。

不脱发的程序猿 440

基于IDEA24.1开发自定义插件

最近想接触idea插件开发相关的内容,但发现网上很多文章都比较过时了,并不适用于高版本的idea和jdk,踩了一些坑后,写一篇文章总结一下高版本idea开发插件的步骤吧。软件版本:JetBrain IDEA 2024.01JDK版本:JDK17需要注意的是,从IDEA2022.2开始,就要求用户必须要有Java17及以上的版本才可以进行插件的开发。

qq_31126893的博客 2578

无人驾驶Autoware导读

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对无人驾驶Autoware介绍做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 2397

点云语义分割:PointNet训练S3DIS数据集

文章目录一、数据准备1.1、数据下载二、训练三、测试 项目地址:pointnet 此次我们是用pointnet网络来做语义分割。代码在pointnet项目中的sem_seg文件夹下,里面也有README.md介绍了训练的过程。 一、数据准备 1.1、数据下载 原始数据下载 处理好的h5格式数据下载 二、训练 三、测试 ...

zhaoguanhua的博客 4176

idea持久化的代码操作-1

这里有必要向大家解释一下什么是持久化的操作,就是与数据库连接的操作。 创建一个class文件来建立连接。 先按如下操作来找到要连接的数据库路径 运行结果如下就成功了! 各个类的代码如下 package cn.edu.mju.project1.persiste.impl; import com.alibaba.druid.pool.DruidDataSource; public c...

c1007331363的博客 849

【学习系列】SAP RAP 1:关于RAP的一些基本介绍

摘要:SAP RAP和CAP是两种不同的开发模型。RAP(RESTful ABAP)用于在S/4HANA等ABAP平台上构建现代业务应用,基于CDS+OData,适合ABAP开发者扩展核心业务。CAP(云应用编程模型)是BTP上的云原生框架,支持Node.js/Java,适合构建跨系统集成应用。RAP优势在于与S/4HANA深度集成,CAP则更灵活,支持多云环境。选择依据主要取决于开发平台(S/4HANA或BTP)、技术栈(ABAP或Node.js/Java)及应用场景(核心扩展或云原生开发)。

DeveloperMrMeng的博客 1165

终极指南:如何使用RoboPOJOGenerator快速实现JSON到Java对象转换

RoboPOJOGenerator是一款功能强大的IntelliJ IDEA和Android Studio插件,专门用于简化JSON数据到POJO(Plain Old Java Object)的转换过程。无论你是处理API响应、配置文件还是数据传输,这个插件都能让你在几秒钟内完成复杂的对象映射工作。 ## 🔥 为什么选择RoboPOJOGenerator? 在当今的软件开发中,JSON已经成

gitblog_00944的博客 1130

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

IDEA 插件开发实战

一. 简介 IntelliJ IDEA是一款开发工具,提供很多插件功能,比如阿里规范插件(Alibaba Java Coding Guidelines),但是随着日常业务展开,很多工作重复性编码,浪费很多时间,需要自定义抽象出来一些插件,自动化的方式解决问题,这也是工程师文化的体现。 二.原理 2.1 背景 IntelliJ平台是开源的,基于Apache许可协议,提供很多丰富的工具,提供组件驱动,基于跨平台JVM,可以在创建菜单栏、列表、弹出菜单、对话框等等。可以适用于多种语言,提供相关解析器和PSI模型,

独立开发,substack顶级编辑 8310

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

IDEA插件开发--持久化配置信息方案

idea插件持久化配置信息

时间定格点的博客 2778

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IDEA 插件开发

文章目录前言插件工程创建插件工程结构plugin.xmlPlugin ActionAction 是什么创建Action注册Action快速创建Action运行插件打包插件安装插件Plugin ComponentsComponents 类型创建 Component获取 Component 实例持久化PropertiesComponentPersistentStateComponent注册持久化组件G...

LeBron_Six的专栏 3802

IntelliJ IDE 插件开发 | (二)UI 界面与数据持久化

在上一篇文章中介绍了在IDEA下开发、运行和安装插件的基本步骤,因此创建项目等基础步骤不再赘述,本文则开始介绍如何进行 UI 界面的开发以及相关数据的持久化存储,本文涉及到的的完整代码已上传到Github。本文讲解了关于 UI 界面开发和数据持久化相关的内容,如果有错误或不足之处,欢迎一起交流讨论。

庄周de蝴蝶的博客 5867

【工具使用】小白入门idea插件开发

按照这个流程,你可以从零开始开发一个功能完整的 IntelliJ 插件。如果有具体需求(如代码分析、自定义语言支持等),可以进一步深入相关 API!通过掌握这些核心语法和 API,你可以实现从简单的工具插件到复杂的代码分析功能。Action 是用户触发操作的核心入口(如菜单项、快捷键、工具栏按钮)。扩展 IDEA 的核心功能(如工具窗口、编辑器监听等)。Action 是插件的入口点,例如菜单项、工具栏按钮等。用于操作代码的抽象语法树(AST),支持代码解析和修改。用于管理插件全局状态或单例服务。

wendao76的专栏 4973

IDEA插件开发

插件的用途: 提升开发效率 改变界面显示 plugin.xml文件属性说明 id:表示当前插件的唯一id号 name:插件的名称 version:插件的版本号 vendor:填写开发人的邮箱,公司名称 description:插件的描述,如果将插件上传到IDEA的仓库后,在进行下载的时候就会显示该描述 idea-version:表示当前插件所支持的所有Intellij Idea 的版本 extensions:这里一般会放一些我们自己的扩展的东西,比如新增高亮显示,新增语言支持都是需要在这里进行扩展 a

海神九考 1231

idea freemarker插件_IDEA 插件开发实战

一. 简介IntelliJ IDEA 是一款开发工具,提供很多插件功能,比如阿里规范插件(Alibaba Java Coding Guidelines),但是随着日常业务展开,很多工作重复性编码,浪费很多时间,需要自定义抽象出来一些插件,自动化的方式解决问题,这也是工程师文化的体现。二.原理2.1 背景IntelliJ 平台是开源的,基于 Apache 许可协议,提供很多丰富的工具,提供...

weixin_39821378的博客 7272

【idea实用系列7】Gradle构建项目中IDEA插件

【idea实用系列7】Gradle构建项目中IDEA插件

wang2leee的博客 2304

IDEA AI编程助手插件开发

大模型JetBrains编程插件开发思路

j7a2son的博客 7083

IntelliJ IDEA插件开发入门

idea插件开发插件sdk配置工程构建插件开发相关API常用API总结1.Tools Windows扩展2.按钮Action扩展3.右下角气泡弹出4.setting面板集成5.setting数据持久化6.项目启动监听事件打包和发布思考参考 Idea提供丰富的扩展功能,若学有余力深入了解IDEA插件API,是一个非常好解决工作中重复造轮子问题的途径,且可适用范围广,非常值得学习 学习一样东西还是应该从官方文档入手 插件sdk配置 这里提供两种思路 1.SDK选择IDEA安装路径(自带SDK),但是无法观察源码

Mr_Oolong的博客 1579

这12款idea插件,能让你代码飞起来

基本上每个程序员都会写代码,但写代码的速度不尽相同。为什么有些人,一天只能写几百行代码?而有些人,一天可以写几千行代码?有没有办法,可以提升开发效率,在相同的时间内,写出更多的代码呢?今天我跟大家一起聊聊在idea中,能提升编码效率的12种插件,希望对大家有所帮助。

9957

自定义IDEA代码补全插件

背景: 通过自定义Idea插件了解开发工具的插件如何工作,提高我们的工作效率。 目标: 需要一款插件,当我们输入字符时能自动提示包含这个字符的静态方法,选中后自动完成代码,并引入静态类。 设计: 初步构想,存储所有静态方法,当用户输入时使用自动弹窗显示候选方法。因为有可能并不是所有的静态方法都需要调用,所以可以只遍历用户自定义的文件位置。 我们将上述的步骤分解: 需要在设置页视图化操作,让用户选中文件位置,为后面遍历方法做准备 ...

反魂蝶五分的博客 5054
上一篇: springboot3登陆注册功能实现
下一篇: IDEA插件开发,自定义设置帮助按钮
xx~
xx~
博客等级 码龄8年 8375粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值